switched graphics library from arts to cairo+pango
authoroetiker <oetiker@a5681a0c-68f1-0310-ab6d-d61299d08faa>
Sun, 10 Jun 2007 23:55:13 +0000 (23:55 +0000)
committeroetiker <oetiker@a5681a0c-68f1-0310-ab6d-d61299d08faa>
Sun, 10 Jun 2007 23:55:13 +0000 (23:55 +0000)
git-svn-id: svn://svn.oetiker.ch/rrdtool/trunk/program@1102 a5681a0c-68f1-0310-ab6d-d61299d08faa

14 files changed:
acinclude.m4
configure.ac
src/Makefile.am
src/art_rgba_svp.c [deleted file]
src/art_rgba_svp.h [deleted file]
src/rrd_afm.c [deleted file]
src/rrd_afm.h [deleted file]
src/rrd_afm_data.c [deleted file]
src/rrd_afm_data.h [deleted file]
src/rrd_gfx.c
src/rrd_gfx.h
src/rrd_graph.c
src/rrd_graph.h
src/rrd_graph_helper.c

index b71fe8e..38ee0c2 100644 (file)
@@ -36,9 +36,9 @@ AC_DEFUN([EX_CHECK_ALL],
              LDFLAGS=${LDFLAGS}" "`$PKGCONFIG --libs-only-other $4`
              LIBS=${LIBS}" "`$PKGCONFIG --libs-only-l $4`
             dnl remove the cached value and test again
              LDFLAGS=${LDFLAGS}" "`$PKGCONFIG --libs-only-other $4`
              LIBS=${LIBS}" "`$PKGCONFIG --libs-only-l $4`
             dnl remove the cached value and test again
-            unset ac_cv_lib_$1_$2
+            unset ac_cv_lib_`echo $1 | sed ['s/[^_a-zA-Z0-9]/_/g;s/^[0-9]/_/']`_$2
              AC_CHECK_LIB($1,$2,[
              AC_CHECK_LIB($1,$2,[
-                unset ac_cv_header_`echo $3 | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']`
+                unset ac_cv_header_`echo $3 | sed ['s/[^_a-zA-Z0-9]/_/g;s/^[0-9]/_/']`
                 AC_CHECK_HEADER($3,[EX_CHECK_STATE=YES],[])
             ],[])
           else
                 AC_CHECK_HEADER($3,[EX_CHECK_STATE=YES],[])
             ],[])
           else
index fab77f5..db2f497 100644 (file)
@@ -275,9 +275,9 @@ dnl -----------------------------------
 
 dnl How the vertical axis label is printed
 AC_ARG_VAR(RRDGRAPH_YLEGEND_ANGLE, 
 
 dnl How the vertical axis label is printed
 AC_ARG_VAR(RRDGRAPH_YLEGEND_ANGLE, 
- [Vertical label angle: 90.0 (default) or 270.0])
+ [Vertical label angle: -90.0 (default) or 90.0])
 AC_DEFINE_UNQUOTED(RRDGRAPH_YLEGEND_ANGLE,${RRDGRAPH_YLEGEND_ANGLE:-90.0},
 AC_DEFINE_UNQUOTED(RRDGRAPH_YLEGEND_ANGLE,${RRDGRAPH_YLEGEND_ANGLE:-90.0},
- [Vertical label angle: 90.0 (default) or 270.0])
+ [Vertical label angle: -90.0 (default) or 90.0])
 
 AC_ARG_ENABLE(rrdcgi,[  --disable-rrdcgi        disable building of rrdcgi],
 [],[enable_rrdcgi=yes])
 
 AC_ARG_ENABLE(rrdcgi,[  --disable-rrdcgi        disable building of rrdcgi],
 [],[enable_rrdcgi=yes])
@@ -289,7 +289,7 @@ AC_ARG_WITH(rrd-default-font,
   if test -d ${WINDIR:-nodir}/cour.ttf ; then
        RRD_DEFAULT_FONT=`cd $WINDIR;pwd`/cour.ttf
   else
   if test -d ${WINDIR:-nodir}/cour.ttf ; then
        RRD_DEFAULT_FONT=`cd $WINDIR;pwd`/cour.ttf
   else
-       RRD_DEFAULT_FONT='$(fontsdir)/$(fonts_DATA)'
+       RRD_DEFAULT_FONT='"DejaVu Sans Mono,Bitstream Vera Sans Mono,Mono"'
   fi
 ])
 
   fi
 ])
 
@@ -601,10 +601,13 @@ AM_CONDITIONAL(BUILD_RRDCGI,[test $enable_rrdcgi != no])
 
 CORE_LIBS="$LIBS"
 
 
 CORE_LIBS="$LIBS"
 
-EX_CHECK_ALL(art_lgpl_2, art_vpath_add_point,       libart_lgpl/libart.h,   libart-2.0,  2.3.17, ftp://ftp.gnome.org/pub/GNOME/sources/libart_lgpl/2.3/, /usr/include/libart-2.0)
-EX_CHECK_ALL(z,          zlibVersion,               zlib.h,                 zlib,        1.2.3,  http://www.gzip.org/zlib/, "")
-EX_CHECK_ALL(png,        png_access_version_number, png.h,                  libpng,      1.2.10,  http://prdownloads.sourceforge.net/libpng/, "")
-EX_CHECK_ALL(freetype,   FT_Init_FreeType,          ft2build.h,                    freetype2,   2.1.10,  http://prdownloads.sourceforge.net/freetype/, /usr/include/freetype2)
+dnl EX_CHECK_ALL(z,          zlibVersion,               zlib.h,                 zlib,        1.2.3,  http://www.gzip.org/zlib/, "")
+dnl EX_CHECK_ALL(png,        png_access_version_number, png.h,                  libpng,      1.2.10,  http://prdownloads.sourceforge.net/libpng/, "")
+dnl EX_CHECK_ALL(freetype,   FT_Init_FreeType,          ft2build.h,                    freetype2,   2.1.10,  http://prdownloads.sourceforge.net/freetype/, /usr/include/freetype2)
+dnl EX_CHECK_ALL(fontconfig, FcInit,                    fontconfig.h,              fontconfig,  2.3.1,  http://fontconfig.org/release/, /usr/include)
+EX_CHECK_ALL(cairo,      cairo_version,             cairo.h,                cairo-png,   1.4.6,  http://cairographics.org/releases/, "")
+dnl EX_CHECK_ALL(glib-2.0,   glib_check_version,        glib.h,                 glib-2.0,    2.12.12, ftp://ftp.gtk.org/pub/glib/2.12/, "")
+EX_CHECK_ALL(pango-1.0,  pango_version_check,       pango/pango.h,          pangocairo,  1.17,    http://ftp.gnome.org/pub/GNOME/sources/pango/1.17, "")
 
 if test "$EX_CHECK_ALL_ERR" = "YES"; then
   AC_MSG_ERROR([Please fix the library issues listed above and try again.])
 
 if test "$EX_CHECK_ALL_ERR" = "YES"; then
   AC_MSG_ERROR([Please fix the library issues listed above and try again.])
index 56ffbb2..77d9245 100644 (file)
@@ -11,8 +11,6 @@ if STATIC_PROGRAMS
 AM_LDFLAGS = -all-static
 endif
 
 AM_LDFLAGS = -all-static
 endif
 
-#INCLUDES = $(FREETYPE_INCLUDES) $(ART_INCLUDES) \
-#           $(PNG_INCLUDES) $(ZLIB_INCLUDES)
 RRD_DEFAULT_FONT=@RRD_DEFAULT_FONT@
 AM_CPPFLAGS = -DRRD_DEFAULT_FONT=\"$(RRD_DEFAULT_FONT)\" -DNUMVERS=@NUMVERS@
 
 RRD_DEFAULT_FONT=@RRD_DEFAULT_FONT@
 AM_CPPFLAGS = -DRRD_DEFAULT_FONT=\"$(RRD_DEFAULT_FONT)\" -DNUMVERS=@NUMVERS@
 
@@ -42,9 +40,7 @@ RRD_C_FILES =         \
        rrd_first.c     \
        rrd_restore.c   \
        rrd_xport.c     \
        rrd_first.c     \
        rrd_restore.c   \
        rrd_xport.c     \
-        art_rgba_svp.c \
        rrd_gfx.c \
        rrd_gfx.c \
-       rrd_afm.c rrd_afm_data.c \
        rrd_dump.c      \
        rrd_fetch.c     \
        rrd_tool.c      \
        rrd_dump.c      \
        rrd_fetch.c     \
        rrd_tool.c      \
@@ -52,12 +48,11 @@ RRD_C_FILES =               \
        rrd_tune.c
 
 noinst_HEADERS = \
        rrd_tune.c
 
 noinst_HEADERS = \
-        art_rgba_svp.h \
        unused.h \
        rrd_gfx.h \
        rrd_getopt.h parsetime.h \
        rrd_format.h rrd_tool.h rrd_xport.h rrd.h rrd_hw.h rrd_rpncalc.h \
        unused.h \
        rrd_gfx.h \
        rrd_getopt.h parsetime.h \
        rrd_format.h rrd_tool.h rrd_xport.h rrd.h rrd_hw.h rrd_rpncalc.h \
-       rrd_nan_inf.h fnv.h rrd_graph.h rrd_afm.h rrd_afm_data.h \
+       rrd_nan_inf.h fnv.h rrd_graph.h \
        rrd_is_thread_safe.h
 
 noinst_LTLIBRARIES        = librrdupd.la
        rrd_is_thread_safe.h
 
 noinst_LTLIBRARIES        = librrdupd.la
diff --git a/src/art_rgba_svp.c b/src/art_rgba_svp.c
deleted file mode 100644 (file)
index 1cb96a6..0000000
+++ /dev/null
@@ -1,336 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- *  art_rgba_svp.c: A slightly modified version of art_rgb_svp to render into rgba buffer
- *
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Library General Public License
- *  as published by the Free Software Foundation; either version 2 of
- *  the License, or (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU Library General Public License for more details.
- *
- *  You should have received a copy of the GNU Library General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- *  Authors:
- *    Raph Levien <raph@acm.org>
- *    Lauris Kaplinski <lauris@ariman.ee>
- *
- *  Copyright (C) 1998 Raph Levien
- *
- */
-
-#define SP_ART_RGBA_SVP_C
-
-/* Render a sorted vector path into an RGBA buffer. */
-
-#include <libart_lgpl/art_misc.h>
-#include <libart_lgpl/art_svp.h>
-#include <libart_lgpl/art_svp_render_aa.h>
-#include <libart_lgpl/art_rgb.h>
-
-#include "art_rgba_svp.h"
-#include "unused.h"
-
-static void art_rgba_fill_run(
-    art_u8 * linebuf,
-    art_u8 r,
-    art_u8 g,
-    art_u8 b,
-    int n);
-static void art_rgba_run_alpha(
-    art_u8 * linebuf,
-    art_u8 r,
-    art_u8 g,
-    art_u8 b,
-    int alpha,
-    int n);
-
-typedef struct _ArtRgbaSVPAlphaData ArtRgbaSVPAlphaData;
-
-struct _ArtRgbaSVPAlphaData {
-    int       alphatab[256];
-    art_u8    r, g, b, alpha;
-    art_u8   *buf;
-    int       rowstride;
-    int       libart_x0, libart_x1;
-};
-
-static void art_rgba_svp_alpha_callback(
-    void *callback_data,
-    int UNUSED(y),
-    int start,
-    ArtSVPRenderAAStep * steps,
-    int n_steps)
-{
-    ArtRgbaSVPAlphaData *data = callback_data;
-    art_u8   *linebuf;
-    int       run_x0, run_x1;
-    art_u32   running_sum = start;
-    int       libart_x0, libart_x1;
-    int       k;
-    art_u8    r, g, b;
-    int      *alphatab;
-    int       alpha;
-
-    linebuf = data->buf;
-    libart_x0 = data->libart_x0;
-    libart_x1 = data->libart_x1;
-
-    r = data->r;
-    g = data->g;
-    b = data->b;
-    alphatab = data->alphatab;
-
-    if (n_steps > 0) {
-        run_x1 = steps[0].x;
-        if (run_x1 > libart_x0) {
-            alpha = (running_sum >> 16) & 0xff;
-            if (alpha)
-                art_rgba_run_alpha(linebuf,
-                                   r, g, b, alphatab[alpha],
-                                   run_x1 - libart_x0);
-        }
-
-        /* render the steps into tmpbuf */
-        for (k = 0; k < n_steps - 1; k++) {
-            running_sum += steps[k].delta;
-            run_x0 = run_x1;
-            run_x1 = steps[k + 1].x;
-            if (run_x1 > run_x0) {
-                alpha = (running_sum >> 16) & 0xff;
-                if (alpha)
-                    art_rgba_run_alpha(linebuf + (run_x0 - libart_x0) * 4,
-                                       r, g, b, alphatab[alpha],
-                                       run_x1 - run_x0);
-            }
-        }
-        running_sum += steps[k].delta;
-        if (libart_x1 > run_x1) {
-            alpha = (running_sum >> 16) & 0xff;
-            if (alpha)
-                art_rgba_run_alpha(linebuf + (run_x1 - libart_x0) * 4,
-                                   r, g, b, alphatab[alpha],
-                                   libart_x1 - run_x1);
-        }
-    } else {
-        alpha = (running_sum >> 16) & 0xff;
-        if (alpha)
-            art_rgba_run_alpha(linebuf,
-                               r, g, b, alphatab[alpha],
-                               libart_x1 - libart_x0);
-    }
-
-    data->buf += data->rowstride;
-}
-
-static void art_rgba_svp_alpha_opaque_callback(
-    void *callback_data,
-    int UNUSED(y),
-    int start,
-    ArtSVPRenderAAStep * steps,
-    int n_steps)
-{
-    ArtRgbaSVPAlphaData *data = callback_data;
-    art_u8   *linebuf;
-    int       run_x0, run_x1;
-    art_u32   running_sum = start;
-    int       libart_x0, libart_x1;
-    int       k;
-    art_u8    r, g, b;
-    int      *alphatab;
-    int       alpha;
-
-    linebuf = data->buf;
-    libart_x0 = data->libart_x0;
-    libart_x1 = data->libart_x1;
-
-    r = data->r;
-    g = data->g;
-    b = data->b;
-    alphatab = data->alphatab;
-
-    if (n_steps > 0) {
-        run_x1 = steps[0].x;
-        if (run_x1 > libart_x0) {
-            alpha = running_sum >> 16;
-            if (alpha) {
-                if (alpha >= 255)
-                    art_rgba_fill_run(linebuf, r, g, b, run_x1 - libart_x0);
-                else
-                    art_rgba_run_alpha(linebuf,
-                                       r, g, b, alphatab[alpha],
-                                       run_x1 - libart_x0);
-            }
-        }
-
-        /* render the steps into tmpbuf */
-        for (k = 0; k < n_steps - 1; k++) {
-            running_sum += steps[k].delta;
-            run_x0 = run_x1;
-            run_x1 = steps[k + 1].x;
-            if (run_x1 > run_x0) {
-                alpha = running_sum >> 16;
-                if (alpha) {
-                    if (alpha >= 255)
-                        art_rgba_fill_run(linebuf + (run_x0 - libart_x0) * 4,
-                                          r, g, b, run_x1 - run_x0);
-                    else
-                        art_rgba_run_alpha(linebuf + (run_x0 - libart_x0) * 4,
-                                           r, g, b, alphatab[alpha],
-                                           run_x1 - run_x0);
-                }
-            }
-        }
-        running_sum += steps[k].delta;
-        if (libart_x1 > run_x1) {
-            alpha = running_sum >> 16;
-            if (alpha) {
-                if (alpha >= 255)
-                    art_rgba_fill_run(linebuf + (run_x1 - libart_x0) * 4,
-                                      r, g, b, libart_x1 - run_x1);
-                else
-                    art_rgba_run_alpha(linebuf + (run_x1 - libart_x0) * 4,
-                                       r, g, b, alphatab[alpha],
-                                       libart_x1 - run_x1);
-            }
-        }
-    } else {
-        alpha = running_sum >> 16;
-        if (alpha) {
-            if (alpha >= 255)
-                art_rgba_fill_run(linebuf, r, g, b, libart_x1 - libart_x0);
-            else
-                art_rgba_run_alpha(linebuf,
-                                   r, g, b, alphatab[alpha],
-                                   libart_x1 - libart_x0);
-        }
-    }
-
-    data->buf += data->rowstride;
-}
-
-/**
- * gnome_print_art_rgba_svp_alpha: Alpha-composite sorted vector path over RGBA buffer.
- * @svp: The source sorted vector path.
- * @libart_x0: Left coordinate of destination rectangle.
- * @libart_y0: Top coordinate of destination rectangle.
- * @libart_x1: Right coordinate of destination rectangle.
- * @libart_y1: Bottom coordinate of destination rectangle.
- * @rgba: Color in 0xRRGGBBAA format.
- * @buf: Destination RGB buffer.
- * @rowstride: Rowstride of @buf buffer.
- * @alphagamma: #ArtAlphaGamma for gamma-correcting the compositing.
- *
- * Renders the shape specified with @svp over the @buf RGB buffer.
- * @libart_x1 - @x0 specifies the width, and @libart_y1 - @libart_y0 specifies the height,
- * of the rectangle rendered. The new pixels are stored starting at
- * the first byte of @buf. Thus, the @x0 and @libart_y0 parameters specify
- * an offset within @svp, and may be tweaked as a way of doing
- * integer-pixel translations without fiddling with @svp itself.
- *
- * The @rgba argument specifies the color for the rendering. Pixels of
- * entirely 0 winding number are left untouched. Pixels of entirely
- * 1 winding number have the color @rgba composited over them (ie,
- * are replaced by the red, green, blue components of @rgba if the alpha
- * component is 0xff). Pixels of intermediate coverage are interpolated
- * according to the rule in @alphagamma, or default to linear if
- * @alphagamma is NULL.
- **/
-void gnome_print_art_rgba_svp_alpha(
-    const ArtSVP * svp,
-    int libart_x0,
-    int libart_y0,
-    int libart_x1,
-    int libart_y1,
-    art_u32 rgba,
-    art_u8 * buf,
-    int rowstride,
-    ArtAlphaGamma UNUSED(*alphagamma))
-{
-    ArtRgbaSVPAlphaData data;
-    int       r, g, b, alpha;
-    int       i;
-    int       a, da;
-
-    r = rgba >> 24;
-    g = (rgba >> 16) & 0xff;
-    b = (rgba >> 8) & 0xff;
-    alpha = rgba & 0xff;
-
-    data.r = r;
-    data.g = g;
-    data.b = b;
-    data.alpha = alpha;
-
-    a = 0x8000;
-    da = (alpha * 66051 + 0x80) >> 8;   /* 66051 equals 2 ^ 32 / (255 * 255) */
-
-    for (i = 0; i < 256; i++) {
-        data.alphatab[i] = a >> 16;
-        a += da;
-    }
-
-    data.buf = buf;
-    data.rowstride = rowstride;
-    data.libart_x0 = libart_x0;
-    data.libart_x1 = libart_x1;
-    if (alpha == 255)
-        art_svp_render_aa(svp, libart_x0, libart_y0, libart_x1, libart_y1,
-                          art_rgba_svp_alpha_opaque_callback, &data);
-    else
-        art_svp_render_aa(svp, libart_x0, libart_y0, libart_x1, libart_y1,
-                          art_rgba_svp_alpha_callback, &data);
-}
-
-static void art_rgba_fill_run(
-    art_u8 * buf,
-    art_u8 r,
-    art_u8 g,
-    art_u8 b,
-    int n)
-{
-    int       i;
-
-    for (i = 0; i < n; i++) {
-        *buf++ = r;
-        *buf++ = g;
-        *buf++ = b;
-        *buf++ = 255;
-    }
-}
-
-/* fixme: this */
-
-static void art_rgba_run_alpha(
-    art_u8 * buf,
-    art_u8 r,
-    art_u8 g,
-    art_u8 b,
-    int alpha,
-    int n)
-{
-    int       i;
-    int       br, bg, bb, ba;
-    int       cr, cg, cb;
-
-    for (i = 0; i < n; i++) {
-        br = *(buf + 0);
-        bg = *(buf + 1);
-        bb = *(buf + 2);
-        ba = *(buf + 3);
-
-        cr = (br * ba + 0x80) >> 8;
-        cg = (bg * ba + 0x80) >> 8;
-        cb = (bb * ba + 0x80) >> 8;
-
-        *buf++ = cr + (((r - cr) * alpha + 0x80) >> 8);
-        *buf++ = cg + (((g - cg) * alpha + 0x80) >> 8);
-        *buf++ = cb + (((b - cb) * alpha + 0x80) >> 8);
-        *buf++ = ba + (((255 - ba) * alpha + 0x80) >> 8);
-    }
-}
diff --git a/src/art_rgba_svp.h b/src/art_rgba_svp.h
deleted file mode 100644 (file)
index 406cced..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-#ifndef SP_ART_RGBA_SVP_H
-#define SP_ART_RGBA_SVP_H
-
-#include <libart_lgpl/art_misc.h>
-#include <libart_lgpl/art_alphagamma.h>
-#include <libart_lgpl/art_affine.h>
-#include <libart_lgpl/art_svp.h>
-#include <libart_lgpl/art_uta.h>
-
-void      gnome_print_art_rgba_svp_alpha(
-    const ArtSVP * svp,
-    int x0,
-    int y0,
-    int x1,
-    int y1,
-    art_u32 rgba,
-    art_u8 * buf,
-    int rowstride,
-    ArtAlphaGamma * alphagamma);
-
-#endif                          /* SP_ART_RGBA_SVP_H */
diff --git a/src/rrd_afm.c b/src/rrd_afm.c
deleted file mode 100644 (file)
index a6cdd40..0000000
+++ /dev/null
@@ -1,324 +0,0 @@
-/****************************************************************************
- * RRDtool 1.2.23  Copyright by Tobi Oetiker, 1997-2007
- ****************************************************************************
- * rrd_afm.h  Parsing afm tables to find width of strings.
- ****************************************************************************
- * $Id$
-*/
-
-#if defined(_WIN32) && !defined(__CYGWIN__) && !defined(__CYGWIN32__) && !defined(HAVE_CONFIG_H)
-#include "../win32/config.h"
-#else
-#ifdef HAVE_CONFIG_H
-#include "../rrd_config.h"
-#endif
-#endif
-
-#include "rrd_afm.h"
-#include "rrd_afm_data.h"
-
-#include <stdio.h>
-
-#ifdef HAVE_STRING_H
-#include <string.h>
-#endif
-
-#include "unused.h"
-
-#if 0
-# define DEBUG 1
-# define DLOG(x) fprintf x
-#else
-# define DEBUG 0
-# define DLOG(x)
-#endif
-
-/* Adobe SVG View and Batik 1.1.1 can't handle ligatures.
-   So disable it as we just waste speed.
-   Besides, it doesn't matter much in normal text.
-*/
-#define ENABLE_LIGATURES 0
-
-static const afm_fontinfo *afm_last_used_font = NULL;
-static const char *last_unknown_font = NULL;
-
-#define is_font(p, name) \
-  (!strcmp(p->postscript_name, name) || !strcmp(p->fullname, name))
-
-static const afm_fontinfo *afm_searchfont(
-    const char *name)
-{
-    int       i;
-    const afm_fontinfo *p = afm_last_used_font;
-
-    if (p && is_font(p, name))
-        return p;
-    p = afm_fontinfolist;
-    for (i = 0; i < afm_fontinfo_count; i++, p++) {
-        if (is_font(p, name)) {
-            afm_last_used_font = p;
-            return p;
-        }
-    }
-    return NULL;
-}
-
-
-/* returns always a font, never NULL.
-   The rest of the code depends on the result never being NULL.
-   See rrd_afm.h */
-static const afm_fontinfo *afm_findfont(
-    const char *name)
-{
-    const afm_fontinfo *p = afm_searchfont(name);
-
-    if (p)
-        return p;
-    if (!last_unknown_font || strcmp(name, last_unknown_font)) {
-        fprintf(stderr, "Can't find font '%s'\n", name);
-        last_unknown_font = name;
-    }
-    p = afm_searchfont(RRD_AFM_DEFAULT_FONT);
-    if (p)
-        return p;
-    return afm_fontinfolist;    /* anything, just anything. */
-}
-
-const char *afm_get_font_postscript_name(
-    const char *font)
-{
-    const afm_fontinfo *p = afm_findfont(font);
-
-    return p->postscript_name;
-}
-
-const char *afm_get_font_name(
-    const char *font)
-{
-    const afm_fontinfo *p = afm_findfont(font);
-
-    return p->fullname;
-}
-
-double afm_get_ascender(
-    const char *font,
-    double size)
-{
-    const afm_fontinfo *p = afm_findfont(font);
-
-    return size * p->ascender / 1000.0;
-}
-
-double afm_get_descender(
-    const char *font,
-    double size)
-{
-    const afm_fontinfo *p = afm_findfont(font);
-
-    return size * p->descender / 1000.0;
-}
-
-static int afm_find_char_index(
-    const afm_fontinfo *fontinfo,
-    afm_cunicode ch1)
-{
-    int       idx = ch1 - 32;
-    afm_cuint16 *indexP;
-    int       numIndexChars, i;
-
-    if (idx <= 0)
-        return 0;
-    if (idx <= 126 - 32)
-        return idx;
-    indexP = fontinfo->highchars_index;
-    if (indexP == 0)
-        return 0;
-    numIndexChars = fontinfo->highchars_count;
-    DLOG((stderr, " find highbit, num = %d\n", numIndexChars));
-    if (ch1 >= 161 && ch1 <= 255) {
-        idx = ch1 - 161;
-        DLOG((stderr, "  161, idx = %d -> %d\n", idx, indexP[idx]));
-        if (idx < numIndexChars && indexP[idx] == ch1) {
-            idx += 127 - 32;
-            DLOG((stderr, "  161-guessed ok to %d\n", idx));
-            return idx;
-        }
-    }
-    for (i = 0; i < numIndexChars; i++) {
-        DLOG((stderr, "    compares to %d -> %d\n", indexP[i], i));
-        if (indexP[i] == ch1)
-            return i + 127 - 32;
-    }
-    DLOG((stderr, "Did not find %d in highchars_index ??\n", ch1));
-    return 0;
-}
-
-#if ENABLE_LIGATURES
-static afm_cunicode afm_find_combined_ligature(
-    const afm_fontinfo *fontinfo,
-    afm_cunicode ch1,
-    afm_cunicode ch2)
-{
-    afm_cunicode *p = fontinfo->ligatures;
-    int       num = fontinfo->ligatures_count;
-    int       i;
-
-    if (!num)
-        return 0;
-    DLOG((stderr, " find-lig, num = %d\n", num));
-    for (i = 0; i < num; i++, p += 3) {
-        DLOG((stderr, "    lig: %d + %d -> %d (%c %c %c)\n",
-              p[0], p[1], p[2], p[0], p[1], p[2]));
-        if (ch1 == *p && ch2 == p[1]) {
-            DLOG((stderr, "   matches.\n"));
-            return p[2];
-        }
-    }
-    return 0;
-}
-#endif
-
-#define READ_ESCAPED(p, val) \
-  if ((val = *p++) == 0) { \
-    val = 254 + *p++; \
-  } else if (!--val) { \
-    val = *p++ << 8; \
-    val |= *p++; \
-  }
-
-
-static long afm_find_kern(
-    const afm_fontinfo *fontinfo,
-    int kern_idx,
-    afm_cunicode ch2)
-{
-    afm_cuint8 *p8 = fontinfo->kerning_data + kern_idx;
-    int       num;
-
-    READ_ESCAPED(p8, num);
-    DLOG((stderr, " find kern, num pairs = %d\n", num));
-    while (num > 0) {
-        afm_unicode ch;
-
-        READ_ESCAPED(p8, ch);
-        DLOG((stderr, "     pair-char = %d\n", ch));
-        if (ch == ch2) {
-            DLOG((stderr, " got kern = %d\n", *(afm_csint8 *) p8));
-            return *(afm_csint8 *) p8;
-        }
-        p8++;
-        num--;
-    }
-    return 0;
-}
-
-/* measure width of a text string */
-double afm_get_text_width(
-    double start,
-    const char *font,
-    double size,
-    double tabwidth,
-    const char *text)
-{
-#ifdef HAVE_MBSTOWCS
-    size_t    clen = strlen(text) + 1;
-    wchar_t  *cstr = malloc(sizeof(wchar_t) * clen);    /* yes we are allocating probably too much here, I know */
-    int       text_count = mbstowcs(cstr, text, clen);
-    double    w;
-
-    if (text_count == -1)
-        text_count = mbstowcs(cstr, "Enc-Err", 6);
-#ifdef __APPLE__
-    while (text_count > 0) {
-        text_count--;
-        cstr[text_count] = afm_fix_osx_charset(cstr[text_count]);   /* unsafe macro */
-    }
-#endif
-    w = afm_get_text_width_wide(start, font, size, tabwidth, cstr);
-    free(cstr);
-    return w;
-#else
-    return afm_get_text_width_wide(start, font, size, tabwidth, text);
-#endif
-}
-
-double afm_get_text_width_wide(
-    double UNUSED(start),
-    const char *font,
-    double size,
-    double UNUSED(tabwidth),
-    const afm_char * text)
-{
-    const afm_fontinfo *fontinfo = afm_findfont(font);
-    long      width = 0;
-    double    widthf;
-    const afm_char *up = text;
-
-    DLOG((stderr, "================= %s\n", text));
-    if (fontinfo == NULL) {
-        while (*up)
-            up++;
-        return size * (up - text);
-    }
-    while (1) {
-        afm_unicode ch1, ch2;
-        int       idx1, kern_idx;
-
-        if ((ch1 = *up) == 0)
-            break;
-        ch2 = *++up;
-        DLOG((stderr, "------------- Loop: %d + %d (%c%c)   at %d\n",
-              ch1, ch2, ch1, ch2 ? ch2 : ' ',
-              (up - (const unsigned char *) text) - 1));
-        idx1 = afm_find_char_index(fontinfo, ch1);
-        DLOG((stderr, "  idx1 = %d\n", idx1));
-#if ENABLE_LIGATURES
-        if (ch2) {
-            int       ch1_new =
-                afm_find_combined_ligature(fontinfo, ch1, ch2);
-
-            DLOG((stderr, "  lig-ch = %d\n", ch1_new));
-            if (ch1_new) {
-                ch1 = ch1_new;
-                idx1 = afm_find_char_index(fontinfo, ch1);
-                ch2 = *++up;
-                DLOG((stderr, "  -> idx1 = %d, ch2 = %d (%c)\n",
-                      idx1, ch2, ch2 ? ch2 : ' '));
-            }
-        }
-#endif
-        width += fontinfo->widths[idx1];
-        DLOG((stderr, "Plain width of %d = %d\n", ch1,
-              fontinfo->widths[idx1]));
-        if (fontinfo->kerning_index && ch2) {
-            kern_idx = fontinfo->kerning_index[idx1];
-            DLOG((stderr, "    kern_idx = %d\n", kern_idx));
-            if (kern_idx > 0)
-                width += afm_find_kern(fontinfo, kern_idx, ch2);
-        }
-    }
-    widthf = (width * 6 / 1000.0) * size;
-    DLOG((stderr, "Returns %ld (%ld) -> %f\n", width, width * 6, widthf));
-    return widthf;
-}
-
-#ifdef __APPLE__
-const unsigned char afm_mac2iso[128] = {
-    '\xC4', '\xC5', '\xC7', '\xC9', '\xD1', '\xD6', '\xDC', '\xE1', /* 80 */
-    '\xE0', '\xE2', '\xE4', '\xE3', '\xE5', '\xE7', '\xE9', '\xE8', /* 88 */
-    '\xEA', '\xEB', '\xED', '\xEC', '\xEE', '\xEF', '\xF1', '\xF3', /* 90 */
-    '\xF2', '\xF4', '\xF6', '\xF5', '\xFA', '\xF9', '\xFB', '\xFC', /* 98 */
-    '\xDD', '\xB0', '\xA2', '\xA3', '\xA7', ' ', '\xB6', '\xDF',    /* A0 */
-    '\xAE', '\xA9', ' ', '\xB4', '\xA8', ' ', '\xC6', '\xD8',   /* A8 */
-    ' ', '\xB1', '\xBE', ' ', '\xA5', '\xB5', ' ', ' ', /* B0 */
-    '\xBD', '\xBC', ' ', '\xAA', '\xBA', ' ', '\xE6', '\xF8',   /* B8 */
-    '\xBF', '\xA1', '\xAC', ' ', ' ', ' ', ' ', '\xAB', /* C0 */
-    '\xBB', ' ', '\xA0', '\xC0', '\xC3', '\xD5', ' ', '\xA6',   /* C8 */
-    '\xAD', ' ', '"', '"', '\'', '\'', '\xF7', '\xD7',  /* D0 */
-    '\xFF', ' ', ' ', '\xA4', '\xD0', '\xF0', '\xDE', '\xFE',   /* D8 */
-    '\xFD', '\xB7', ' ', ' ', ' ', '\xC2', '\xCA', '\xC1',  /* E0 */
-    '\xCB', '\xC8', '\xCD', '\xCE', '\xCF', '\xCC', '\xD3', '\xD4', /* E8 */
-    ' ', '\xD2', '\xDA', '\xDB', '\xD9', ' ', ' ', ' ', /* F0 */
-    '\xAF', ' ', ' ', ' ', '\xB8', ' ', ' ', ' ',   /* F8 */
-};
-#endif
diff --git a/src/rrd_afm.h b/src/rrd_afm.h
deleted file mode 100644 (file)
index e333cbf..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-/****************************************************************************
- * RRDtool 1.2.23  Copyright by Tobi Oetiker, 1997-2007
- ****************************************************************************
- * rrd_afm.h  Parsing afm tables to find width of strings.
- ****************************************************************************/
-
-#ifndef  RRD_AFM_H
-#define RRD_AFM_H
-
-#include <stdlib.h>
-
-#ifdef HAVE_MBSTOWCS
-#define afm_char wchar_t
-#else
-#define afm_char unsigned char
-#endif
-/*
-   If the font specified by the name parameter in the routes below
-   is not found
-   (because it is not compiled into rrd_afm_data.c by compile_afm.pl)
-   the font specified by RRD_AFM_DEFAULT_FONT will be used.
-   If it is not installed, it uses the first font compiled
-   into rrd_afm_data.c
-   So they will always use some font.
-*/
-
-#define RRD_AFM_DEFAULT_FONT "Courier"
-
-/* measure width of a text string */
-/* fontname can be full name or postscript name */
-double    afm_get_text_width(
-    double start,
-    const char *font,
-    double size,
-    double tabwidth,
-    const char *text);
-double    afm_get_text_width_wide(
-    double start,
-    const char *font,
-    double size,
-    double tabwidth,
-    const afm_char * text);
-
-double    afm_get_ascender(
-    const char *font,
-    double size);
-double    afm_get_descender(
-    const char *font,
-    double size);
-
-/* get postscript name from fullname or postscript name */
-const char *afm_get_font_postscript_name(
-    const char *font);
-const char *afm_get_font_name(
-    const char *font);
-
-/* cc -E -dM /dev/null */
-#ifdef __APPLE__
-/* need charset conversion from macintosh to unicode. */
-extern const unsigned char afm_mac2iso[128];
-
-#define afm_fix_osx_charset(c) \
-       ( (c) >= 128 && (c) <= 255 ? afm_mac2iso[(c) - 128] : (c))
-#else
-/* UNSAFE macro */
-#define afm_fix_osx_charset(x) (x)
-#endif
-
-#endif
diff --git a/src/rrd_afm_data.c b/src/rrd_afm_data.c
deleted file mode 100644 (file)
index c922163..0000000
+++ /dev/null
@@ -1,6298 +0,0 @@
-/****************************************************************************
- * RRDtool 1.2.23  Copyright by Tobi Oetiker, 1997-2007
- ****************************************************************************
- * rrd_afm_data.c  Encoded afm (Adobe Font Metrics) for selected fonts.
- ****************************************************************************
- *
- * THIS FILE IS AUTOGENERATED BY PERL. DO NOT EDIT.
- *
- ****************************************************************************/
-
-#include "rrd_afm_data.h"
-#include <stdlib.h>
-
-
-
-/* ------------------------------------------------------------------*/
-/* FontName: Courier */
-/* FullName: Courier */
-/* FamilyName: Courier */
-static afm_cuint8 afm_Courier_widths[] = {  /* 315 */
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100
-};
-static afm_cuint16 afm_Courier_highchars_index[] = {    /* 220 */
-    161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176,
-    177,
-    178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192,
-    193,
-    194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208,
-    209,
-    210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224,
-    225,
-    226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240,
-    241,
-    242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256,
-    257,
-    258, 259, 260, 261, 262, 263, 268, 269, 270, 271, 272, 273, 274, 275, 278,
-    279,
-    280, 281, 282, 283, 286, 287, 290, 291, 298, 299, 302, 303, 304, 305, 310,
-    311,
-    313, 314, 315, 316, 317, 318, 321, 322, 323, 324, 325, 326, 327, 328, 332,
-    333,
-    336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 350, 351, 352,
-    353,
-    354, 355, 356, 357, 362, 363, 366, 367, 368, 369, 370, 371, 376, 377, 378,
-    379,
-    380, 381, 382, 402, 536, 537, 710, 711, 728, 729, 730, 731, 732, 733,
-    8211, 8212,
-    8216, 8217, 8218, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8249,
-    8250,
-    8260, 8364, 8482, 8706, 8710, 8721, 8722, 8730, 8800, 8804, 8805, 9674,
-    63171,
-    64257, 64258
-};
-static afm_cunicode afm_Courier_ligatures[] = { /* 3 */
-    102, 105, 64257
-};
-
-
-/* ------------------------------------------------------------------*/
-/* FontName: Courier-Bold */
-/* FullName: Courier Bold */
-/* FamilyName: Courier */
-static afm_cuint8 afm_Courier_Bold_widths[] = { /* 315 */
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100
-};
-static afm_cuint16 afm_Courier_Bold_highchars_index[] = {   /* 220 */
-    161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176,
-    177,
-    178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192,
-    193,
-    194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208,
-    209,
-    210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224,
-    225,
-    226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240,
-    241,
-    242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256,
-    257,
-    258, 259, 260, 261, 262, 263, 268, 269, 270, 271, 272, 273, 274, 275, 278,
-    279,
-    280, 281, 282, 283, 286, 287, 290, 291, 298, 299, 302, 303, 304, 305, 310,
-    311,
-    313, 314, 315, 316, 317, 318, 321, 322, 323, 324, 325, 326, 327, 328, 332,
-    333,
-    336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 350, 351, 352,
-    353,
-    354, 355, 356, 357, 362, 363, 366, 367, 368, 369, 370, 371, 376, 377, 378,
-    379,
-    380, 381, 382, 402, 536, 537, 710, 711, 728, 729, 730, 731, 732, 733,
-    8211, 8212,
-    8216, 8217, 8218, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8249,
-    8250,
-    8260, 8364, 8482, 8706, 8710, 8721, 8722, 8730, 8800, 8804, 8805, 9674,
-    63171,
-    64257, 64258
-};
-static afm_cunicode afm_Courier_Bold_ligatures[] = {    /* 3 */
-    102, 105, 64257
-};
-
-
-/* ------------------------------------------------------------------*/
-/* FontName: Courier-BoldOblique */
-/* FullName: Courier Bold Oblique */
-/* FamilyName: Courier */
-static afm_cuint8 afm_Courier_BoldOblique_widths[] = {  /* 315 */
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100
-};
-static afm_cuint16 afm_Courier_BoldOblique_highchars_index[] = {    /* 220 */
-    161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176,
-    177,
-    178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192,
-    193,
-    194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208,
-    209,
-    210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224,
-    225,
-    226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240,
-    241,
-    242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256,
-    257,
-    258, 259, 260, 261, 262, 263, 268, 269, 270, 271, 272, 273, 274, 275, 278,
-    279,
-    280, 281, 282, 283, 286, 287, 290, 291, 298, 299, 302, 303, 304, 305, 310,
-    311,
-    313, 314, 315, 316, 317, 318, 321, 322, 323, 324, 325, 326, 327, 328, 332,
-    333,
-    336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 350, 351, 352,
-    353,
-    354, 355, 356, 357, 362, 363, 366, 367, 368, 369, 370, 371, 376, 377, 378,
-    379,
-    380, 381, 382, 402, 536, 537, 710, 711, 728, 729, 730, 731, 732, 733,
-    8211, 8212,
-    8216, 8217, 8218, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8249,
-    8250,
-    8260, 8364, 8482, 8706, 8710, 8721, 8722, 8730, 8800, 8804, 8805, 9674,
-    63171,
-    64257, 64258
-};
-static afm_cunicode afm_Courier_BoldOblique_ligatures[] = { /* 3 */
-    102, 105, 64257
-};
-
-
-/* ------------------------------------------------------------------*/
-/* FontName: Courier-Oblique */
-/* FullName: Courier Oblique */
-/* FamilyName: Courier */
-static afm_cuint8 afm_Courier_Oblique_widths[] = {  /* 315 */
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100
-};
-static afm_cuint16 afm_Courier_Oblique_highchars_index[] = {    /* 220 */
-    161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176,
-    177,
-    178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192,
-    193,
-    194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208,
-    209,
-    210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224,
-    225,
-    226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240,
-    241,
-    242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256,
-    257,
-    258, 259, 260, 261, 262, 263, 268, 269, 270, 271, 272, 273, 274, 275, 278,
-    279,
-    280, 281, 282, 283, 286, 287, 290, 291, 298, 299, 302, 303, 304, 305, 310,
-    311,
-    313, 314, 315, 316, 317, 318, 321, 322, 323, 324, 325, 326, 327, 328, 332,
-    333,
-    336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 350, 351, 352,
-    353,
-    354, 355, 356, 357, 362, 363, 366, 367, 368, 369, 370, 371, 376, 377, 378,
-    379,
-    380, 381, 382, 402, 536, 537, 710, 711, 728, 729, 730, 731, 732, 733,
-    8211, 8212,
-    8216, 8217, 8218, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8249,
-    8250,
-    8260, 8364, 8482, 8706, 8710, 8721, 8722, 8730, 8800, 8804, 8805, 9674,
-    63171,
-    64257, 64258
-};
-static afm_cunicode afm_Courier_Oblique_ligatures[] = { /* 3 */
-    102, 105, 64257
-};
-
-
-/* ------------------------------------------------------------------*/
-/* FontName: Helvetica */
-/* FullName: Helvetica */
-/* FamilyName: Helvetica */
-static afm_cuint8 afm_Helvetica_widths[] = {    /* 315 */
-    46, 46, 59, 93, 93, 148, 111, 32, 56, 56, 65, 97, 46, 56, 46, 46, 93, 93,
-    93, 93, 93,
-    93, 93, 93, 93, 93, 46, 46, 97, 97, 97, 93, 169, 111, 111, 120, 120, 111,
-    102, 130,
-    120, 46, 83, 111, 93, 139, 120, 130, 111, 130, 120, 111, 102, 120, 111,
-    157, 111,
-    111, 102, 46, 46, 46, 78, 93, 56, 93, 93, 83, 93, 93, 46, 93, 93, 37, 37,
-    83, 37, 139,
-    93, 93, 93, 93, 56, 83, 46, 93, 83, 120, 83, 83, 83, 56, 43, 56, 97, 56,
-    93, 93, 93,
-    93, 43, 93, 56, 123, 62, 93, 97, 123, 56, 67, 97, 56, 56, 56, 93, 90, 46,
-    56, 56, 61,
-    93, 139, 139, 139, 102, 111, 111, 111, 111, 111, 111, 167, 120, 111, 111,
-    111, 111,
-    46, 46, 46, 46, 120, 120, 130, 130, 130, 130, 130, 97, 130, 120, 120, 120,
-    120, 111,
-    111, 102, 93, 93, 93, 93, 93, 93, 148, 83, 93, 93, 93, 93, 46, 46, 46, 46,
-    93, 93, 93,
-    93, 93, 93, 93, 97, 102, 93, 93, 93, 93, 83, 93, 83, 111, 93, 111, 93,
-    111, 93, 120,
-    83, 120, 83, 120, 107, 120, 93, 111, 93, 111, 93, 111, 93, 111, 93, 130,
-    93, 130,
-    93, 46, 46, 46, 37, 46, 46, 111, 83, 93, 37, 93, 37, 93, 50, 93, 37, 120,
-    93, 120, 93,
-    120, 93, 130, 93, 130, 93, 167, 157, 120, 56, 120, 56, 120, 56, 111, 83,
-    111, 83,
-    111, 83, 102, 46, 102, 53, 120, 93, 120, 93, 120, 93, 120, 93, 111, 102,
-    83, 102,
-    83, 102, 83, 93, 111, 83, 56, 56, 56, 56, 56, 56, 56, 56, 93, 167, 37, 37,
-    37, 56, 56,
-    56, 93, 93, 58, 167, 167, 56, 56, 28, 93, 167, 79, 102, 100, 97, 76, 92,
-    92, 92, 79,
-    42, 83, 83
-};
-static afm_sint16 afm_Helvetica_kerning_index[] = { /* 315 */
-    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 49, 52, 0, 0,
-    0, 0, 0, 55, 170, 197, 202, 0, 241, 0, 0, 0, 345, 418, 510, 0, 0, 545,
-    594, 687, 710,
-    772, 777, 938, 966, 1115, 0, 1259, 0, 0, 0, 0, 0, 0, 0, 1407, 1419, 1468,
-    0, 1476,
-    1494, 1575, 1587, 0, 0, 1595, 0, 1638, 1668, 1700, 1718, 0, 1730, 1847, 0,
-    0, 1854,
-    1924, 1994, 2017, 2087, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2130, 2245, 2360, 2475, 2590, 2705, 0,
-    2820, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 2825, 2874, 2923, 2972, 3021, 0, 3070, 3119, 3147,
-    3175, 3203,
-    3231, 0, 0, 3379, 3391, 3403, 3415, 3427, 3439, 0, 3451, 3459, 3477, 3495,
-    3513,
-    0, 0, 0, 0, 0, 3531, 3563, 3581, 3599, 3617, 3635, 0, 3653, 0, 0, 0, 0,
-    3882, 0, 3952,
-    4022, 4137, 4149, 4264, 4276, 4391, 4403, 4408, 4416, 4421, 4429, 0, 4468,
-    0,
-    0, 4507, 0, 4525, 0, 4543, 0, 4561, 0, 4579, 0, 4591, 0, 0, 0, 0, 0, 0,
-    4603, 4695,
-    4738, 0, 4773, 0, 4808, 0, 4843, 0, 0, 4878, 0, 4910, 0, 4942, 4974, 5023,
-    5041,
-    5090, 0, 0, 5108, 5170, 5287, 5349, 5466, 5528, 5645, 5650, 5657, 5662,
-    5669,
-    5674, 5681, 0, 5842, 0, 6003, 0, 6031, 0, 6059, 0, 6087, 0, 6115, 0, 6263,
-    0, 6306,
-    0, 6349, 0, 6392, 6397, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6404, 6409, 0, 0,
-    6447, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
-};
-static afm_cuint8 afm_Helvetica_kerning_data[] = {  /* 6450 */
-    42, 11, 85, 249, 87, 249, 88, 250, 90, 242, 222, 242, 0, 100, 249, 0, 102,
-    249, 0,
-    122, 242, 1, 32, 24, 247, 1, 32, 28, 252, 3, 1, 32, 25, 240, 1, 32, 29,
-    240, 4, 33, 247,
-    1, 32, 25, 240, 1, 32, 29, 240, 2, 33, 249, 2, 33, 249, 49, 68, 252, 72,
-    252, 80, 252,
-    82, 252, 85, 237, 86, 249, 87, 245, 88, 249, 90, 240, 118, 252, 119, 250,
-    120, 250,
-    122, 250, 200, 252, 211, 252, 212, 252, 213, 252, 214, 252, 215, 252, 217,
-    252,
-    218, 249, 219, 249, 220, 249, 221, 249, 222, 240, 250, 252, 251, 252, 252,
-    252,
-    253, 252, 254, 250, 0, 1, 250, 0, 8, 252, 0, 14, 252, 0, 32, 252, 0, 36,
-    252, 0, 78,
-    252, 0, 82, 252, 0, 100, 237, 0, 102, 237, 0, 108, 249, 0, 109, 252, 0,
-    112, 249, 0,
-    113, 252, 0, 114, 249, 0, 115, 252, 0, 116, 249, 0, 117, 252, 0, 122, 240,
-    12, 45,
-    254, 47, 254, 86, 255, 218, 255, 219, 255, 220, 255, 221, 255, 0, 108,
-    255, 0, 112,
-    255, 0, 114, 255, 0, 116, 255, 3, 45, 252, 47, 252, 18, 45, 245, 47, 245,
-    66, 250,
-    87, 245, 88, 250, 90, 242, 193, 250, 194, 250, 195, 250, 196, 250, 197,
-    250, 198,
-    250, 222, 242, 0, 2, 250, 0, 4, 250, 0, 6, 250, 0, 122, 242, 45, 45, 232,
-    47, 232, 66,
-    244, 98, 249, 102, 252, 112, 252, 115, 249, 193, 244, 194, 244, 195, 244,
-    196, 244,
-    197, 244, 198, 244, 225, 249, 226, 249, 227, 249, 228, 249, 229, 249, 230,
-    249,
-    233, 252, 234, 252, 235, 252, 236, 252, 243, 252, 244, 252, 245, 252, 246,
-    252,
-    247, 252, 249, 252, 0, 2, 244, 0, 3, 249, 0, 4, 244, 0, 5, 249, 0, 6, 244,
-    0, 7, 249,
-    0, 21, 252, 0, 25, 252, 0, 27, 252, 0, 29, 252, 0, 79, 252, 0, 83, 252, 0,
-    87, 249, 0,
-    89, 249, 0, 91, 249, 32, 45, 252, 47, 252, 66, 254, 98, 254, 118, 254,
-    193, 254, 194,
-    254, 195, 254, 196, 254, 197, 254, 198, 254, 225, 254, 226, 254, 227, 254,
-    228,
-    254, 229, 254, 230, 254, 250, 254, 251, 254, 252, 254, 253, 254, 0, 2,
-    254, 0, 3,
-    254, 0, 4, 254, 0, 5, 254, 0, 6, 254, 0, 7, 254, 0, 109, 254, 0, 113, 254,
-    0, 115, 254,
-    0, 117, 254, 40, 80, 249, 102, 250, 112, 250, 118, 252, 122, 249, 211,
-    249, 212,
-    249, 213, 249, 214, 249, 215, 249, 217, 249, 233, 250, 234, 250, 235, 250,
-    236,
-    250, 243, 250, 244, 250, 245, 250, 246, 250, 247, 250, 249, 250, 250, 252,
-    251,
-    252, 252, 252, 253, 252, 254, 249, 0, 1, 249, 0, 21, 250, 0, 25, 250, 0,
-    27, 250, 0,
-    29, 250, 0, 78, 249, 0, 79, 250, 0, 82, 249, 0, 83, 250, 0, 109, 252, 0,
-    113, 252, 0,
-    115, 252, 0, 117, 252, 14, 85, 239, 87, 239, 88, 245, 90, 234, 122, 252,
-    222, 234,
-    254, 252, 0, 1, 252, 0, 100, 239, 0, 102, 239, 0, 122, 234, 1, 32, 25,
-    230, 1, 32, 29,
-    234, 22, 45, 250, 47, 250, 66, 254, 85, 250, 87, 249, 88, 252, 89, 247,
-    90, 245, 193,
-    254, 194, 254, 195, 254, 196, 254, 197, 254, 198, 254, 222, 245, 0, 2,
-    254, 0, 4,
-    254, 0, 6, 254, 0, 100, 250, 0, 102, 250, 0, 122, 245, 41, 45, 227, 47,
-    227, 66, 237,
-    98, 250, 102, 249, 112, 249, 193, 237, 194, 237, 195, 237, 196, 237, 197,
-    237, 198,
-    237, 225, 250, 226, 250, 227, 250, 228, 250, 229, 250, 230, 250, 233, 249,
-    234,
-    249, 235, 249, 236, 249, 243, 249, 244, 249, 245, 249, 246, 249, 247, 249,
-    249,
-    249, 0, 2, 237, 0, 3, 250, 0, 4, 237, 0, 5, 250, 0, 6, 237, 0, 7, 250, 0,
-    21, 249, 0, 25,
-    249, 0, 27, 249, 0, 29, 249, 0, 79, 249, 0, 83, 249, 10, 86, 255, 218,
-    255, 219, 255,
-    220, 255, 221, 255, 0, 108, 255, 0, 112, 255, 0, 114, 255, 0, 116, 255,
-    27, 80, 254,
-    85, 252, 86, 250, 87, 249, 88, 252, 90, 249, 211, 254, 212, 254, 213, 254,
-    214, 254,
-    215, 254, 217, 254, 218, 250, 219, 250, 220, 250, 221, 250, 222, 249, 0,
-    78, 254,
-    0, 82, 254, 0, 100, 252, 0, 102, 252, 0, 108, 250, 0, 112, 250, 0, 114,
-    250, 0, 116,
-    250, 0, 122, 249, 3, 45, 254, 47, 254, 70, 45, 237, 46, 234, 47, 237, 59,
-    254, 60,
-    254, 66, 237, 80, 250, 98, 237, 102, 237, 112, 237, 115, 237, 118, 237,
-    120, 237,
-    122, 237, 193, 237, 194, 237, 195, 237, 196, 237, 197, 237, 198, 237, 211,
-    250,
-    212, 250, 213, 250, 214, 250, 215, 250, 217, 250, 225, 237, 226, 237, 227,
-    237,
-    228, 247, 229, 237, 230, 237, 233, 247, 234, 237, 235, 237, 236, 237, 243,
-    237,
-    244, 237, 245, 237, 246, 247, 247, 237, 249, 237, 250, 237, 251, 237, 252,
-    237,
-    253, 237, 254, 237, 0, 1, 247, 0, 2, 237, 0, 3, 247, 0, 4, 237, 0, 5, 247,
-    0, 6, 237,
-    0, 7, 237, 0, 21, 247, 0, 25, 237, 0, 27, 237, 0, 29, 237, 0, 78, 250, 0,
-    79, 247, 0,
-    82, 250, 0, 83, 237, 0, 87, 237, 0, 89, 237, 0, 91, 237, 0, 109, 247, 0,
-    113, 237, 0,
-    115, 237, 0, 117, 237, 13, 45, 250, 47, 250, 66, 250, 193, 250, 194, 250,
-    195, 250,
-    196, 250, 197, 250, 198, 250, 0, 2, 250, 0, 4, 250, 0, 6, 250, 65, 45,
-    236, 46, 244,
-    47, 236, 59, 250, 60, 250, 66, 244, 72, 250, 80, 250, 98, 245, 102, 244,
-    112, 244,
-    118, 245, 193, 244, 194, 244, 195, 244, 196, 244, 197, 244, 198, 244, 211,
-    250,
-    212, 250, 213, 250, 214, 250, 215, 250, 217, 250, 225, 245, 226, 245, 227,
-    245,
-    228, 245, 229, 245, 230, 245, 233, 244, 234, 244, 235, 244, 236, 244, 243,
-    244,
-    244, 244, 245, 244, 246, 244, 247, 244, 249, 244, 250, 245, 251, 245, 252,
-    245,
-    253, 245, 0, 2, 244, 0, 3, 245, 0, 4, 244, 0, 5, 245, 0, 6, 244, 0, 7,
-    245, 0, 21, 244,
-    0, 25, 244, 0, 27, 244, 0, 29, 244, 0, 32, 250, 0, 36, 250, 0, 78, 250, 0,
-    79, 244, 0,
-    82, 250, 0, 83, 244, 0, 109, 245, 0, 113, 245, 0, 115, 245, 0, 117, 245,
-    63, 45, 244,
-    46, 250, 47, 244, 66, 249, 80, 254, 98, 250, 102, 252, 112, 252, 118, 252,
-    122, 254,
-    193, 249, 194, 249, 195, 249, 196, 249, 197, 249, 198, 249, 211, 254, 212,
-    254,
-    213, 254, 214, 254, 215, 254, 217, 254, 225, 250, 226, 250, 227, 250, 228,
-    250,
-    229, 250, 230, 250, 233, 252, 234, 252, 235, 252, 236, 252, 243, 252, 244,
-    252,
-    245, 252, 246, 252, 247, 252, 249, 252, 250, 252, 251, 252, 252, 252, 253,
-    252,
-    254, 254, 0, 1, 254, 0, 2, 249, 0, 3, 250, 0, 4, 249, 0, 5, 250, 0, 6,
-    249, 0, 7, 250,
-    0, 21, 252, 0, 25, 252, 0, 27, 252, 0, 29, 252, 0, 78, 254, 0, 79, 252, 0,
-    82, 254, 0,
-    83, 252, 0, 109, 252, 0, 113, 252, 0, 115, 252, 0, 117, 252, 65, 45, 234,
-    46, 234,
-    47, 234, 59, 247, 60, 247, 66, 239, 80, 243, 98, 234, 102, 234, 106, 254,
-    112, 234,
-    118, 239, 193, 239, 194, 239, 195, 239, 196, 239, 197, 239, 198, 239, 211,
-    243,
-    212, 243, 213, 243, 214, 243, 215, 243, 217, 243, 225, 234, 226, 234, 227,
-    234,
-    228, 234, 229, 234, 230, 234, 233, 234, 234, 234, 235, 234, 236, 234, 238,
-    254,
-    243, 234, 244, 234, 245, 234, 246, 234, 247, 234, 249, 234, 250, 239, 251,
-    239,
-    252, 239, 253, 239, 0, 2, 239, 0, 3, 245, 0, 4, 239, 0, 5, 245, 0, 6, 239,
-    0, 7, 234,
-    0, 21, 245, 0, 25, 234, 0, 27, 234, 0, 29, 234, 0, 49, 254, 0, 78, 243, 0,
-    79, 234, 0,
-    82, 243, 0, 83, 234, 0, 109, 239, 0, 113, 239, 0, 115, 239, 0, 117, 239,
-    6, 119, 254,
-    120, 254, 122, 252, 254, 252, 0, 1, 252, 21, 45, 250, 47, 250, 99, 255,
-    109, 254,
-    118, 254, 119, 254, 122, 254, 250, 254, 251, 254, 252, 254, 253, 254, 254,
-    254,
-    0, 1, 254, 0, 60, 254, 0, 62, 254, 0, 68, 254, 0, 109, 254, 0, 113, 254,
-    0, 115, 254,
-    0, 117, 254, 4, 45, 254, 108, 254, 0, 57, 254, 9, 45, 254, 47, 254, 119,
-    252, 120,
-    254, 121, 252, 122, 254, 254, 254, 0, 1, 254, 34, 45, 252, 47, 252, 98,
-    252, 102,
-    252, 112, 252, 225, 252, 226, 252, 227, 252, 228, 252, 229, 252, 230, 252,
-    233,
-    252, 234, 252, 235, 252, 236, 252, 243, 252, 244, 252, 245, 252, 246, 252,
-    247,
-    252, 249, 252, 0, 3, 252, 0, 5, 252, 0, 7, 252, 0, 21, 252, 0, 25, 252, 0,
-    27, 252, 0,
-    29, 252, 0, 51, 252, 0, 79, 252, 0, 83, 252, 1, 32, 25, 8, 1, 32, 29, 10,
-    5, 115, 255,
-    0, 87, 255, 0, 89, 255, 0, 91, 255, 4, 122, 252, 254, 252, 0, 1, 252, 19,
-    102, 254,
-    112, 254, 233, 254, 234, 254, 235, 254, 236, 254, 243, 254, 244, 254, 245,
-    254,
-    246, 254, 247, 254, 249, 254, 0, 21, 254, 0, 25, 254, 0, 27, 254, 0, 29,
-    254, 0, 79,
-    254, 0, 83, 254, 13, 118, 255, 122, 254, 250, 255, 251, 255, 252, 255,
-    253, 255,
-    254, 254, 0, 1, 254, 0, 109, 255, 0, 113, 255, 0, 115, 255, 0, 117, 255,
-    14, 118, 255,
-    119, 254, 122, 254, 250, 255, 251, 255, 252, 255, 253, 255, 254, 254, 0,
-    1, 254,
-    0, 109, 255, 0, 113, 255, 0, 115, 255, 0, 117, 255, 9, 45, 250, 47, 250,
-    119, 254,
-    120, 254, 121, 252, 122, 252, 254, 252, 0, 1, 252, 6, 45, 251, 47, 251,
-    122, 252,
-    254, 252, 0, 1, 252, 50, 45, 249, 47, 249, 59, 5, 60, 5, 98, 255, 106, 3,
-    108, 3, 109,
-    3, 110, 4, 111, 4, 113, 5, 117, 7, 118, 3, 119, 5, 122, 5, 225, 255, 226,
-    255, 227,
-    255, 228, 255, 229, 255, 230, 255, 237, 3, 238, 3, 239, 3, 240, 3, 242, 4,
-    250, 3,
-    251, 3, 252, 3, 253, 3, 254, 5, 0, 1, 5, 0, 3, 255, 0, 5, 255, 0, 7, 255,
-    0, 45, 3, 0, 49,
-    3, 0, 57, 3, 0, 60, 3, 0, 62, 3, 0, 68, 3, 0, 70, 4, 0, 72, 4, 0, 74, 4,
-    0, 101, 7, 0, 109,
-    3, 0, 113, 3, 0, 115, 3, 0, 117, 3, 4, 45, 254, 47, 254, 120, 252, 31, 45,
-    244, 47, 244,
-    98, 253, 102, 253, 112, 253, 225, 253, 226, 253, 227, 253, 228, 253, 229,
-    253, 230,
-    253, 233, 253, 234, 253, 235, 253, 236, 253, 243, 253, 244, 253, 245, 253,
-    246,
-    253, 247, 253, 249, 253, 0, 3, 253, 0, 5, 253, 0, 7, 253, 0, 21, 253, 0,
-    25, 253, 0,
-    27, 253, 0, 29, 253, 0, 79, 253, 0, 83, 253, 31, 45, 247, 47, 247, 98,
-    254, 102, 255,
-    112, 255, 225, 254, 226, 254, 227, 254, 228, 254, 229, 254, 230, 254, 233,
-    255,
-    234, 255, 235, 255, 236, 255, 243, 255, 244, 255, 245, 255, 246, 255, 247,
-    255,
-    249, 255, 0, 3, 254, 0, 5, 254, 0, 7, 254, 0, 21, 255, 0, 25, 255, 0, 27,
-    255, 0, 29,
-    255, 0, 79, 255, 0, 83, 255, 10, 102, 252, 233, 252, 234, 252, 235, 252,
-    236, 252,
-    0, 21, 252, 0, 25, 252, 0, 27, 252, 0, 29, 252, 31, 45, 240, 47, 240, 98,
-    254, 102,
-    254, 112, 254, 225, 254, 226, 254, 227, 254, 228, 254, 229, 254, 230, 254,
-    233,
-    254, 234, 254, 235, 254, 236, 254, 243, 254, 244, 254, 245, 254, 246, 254,
-    247,
-    254, 249, 254, 0, 3, 254, 0, 5, 254, 0, 7, 254, 0, 21, 254, 0, 25, 254, 0,
-    27, 254, 0,
-    29, 254, 0, 79, 254, 0, 83, 254, 19, 102, 254, 112, 254, 233, 254, 234,
-    254, 235,
-    254, 236, 254, 243, 254, 244, 254, 245, 254, 246, 254, 247, 254, 249, 254,
-    0, 21,
-    254, 0, 25, 254, 0, 27, 254, 0, 29, 254, 0, 79, 254, 0, 83, 254, 49, 68,
-    252, 72, 252,
-    80, 252, 82, 252, 85, 237, 86, 249, 87, 245, 88, 249, 90, 240, 118, 252,
-    119, 250,
-    120, 250, 122, 250, 200, 252, 211, 252, 212, 252, 213, 252, 214, 252, 215,
-    252,
-    217, 252, 218, 249, 219, 249, 220, 249, 221, 249, 222, 240, 250, 252, 251,
-    252,
-    252, 252, 253, 252, 254, 250, 0, 1, 250, 0, 8, 252, 0, 14, 252, 0, 32,
-    252, 0, 36, 252,
-    0, 78, 252, 0, 82, 252, 0, 100, 237, 0, 102, 237, 0, 108, 249, 0, 109,
-    252, 0, 112,
-    249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116, 249, 0, 117, 252, 0,
-    122, 240,
-    49, 68, 252, 72, 252, 80, 252, 82, 252, 85, 237, 86, 249, 87, 245, 88,
-    249, 90, 240,
-    118, 252, 119, 250, 120, 250, 122, 250, 200, 252, 211, 252, 212, 252, 213,
-    252,
-    214, 252, 215, 252, 217, 252, 218, 249, 219, 249, 220, 249, 221, 249, 222,
-    240,
-    250, 252, 251, 252, 252, 252, 253, 252, 254, 250, 0, 1, 250, 0, 8, 252, 0,
-    14, 252,
-    0, 32, 252, 0, 36, 252, 0, 78, 252, 0, 82, 252, 0, 100, 237, 0, 102, 237,
-    0, 108, 249,
-    0, 109, 252, 0, 112, 249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116,
-    249, 0, 117,
-    252, 0, 122, 240, 49, 68, 252, 72, 252, 80, 252, 82, 252, 85, 237, 86,
-    249, 87, 245,
-    88, 249, 90, 240, 118, 252, 119, 250, 120, 250, 122, 250, 200, 252, 211,
-    252, 212,
-    252, 213, 252, 214, 252, 215, 252, 217, 252, 218, 249, 219, 249, 220, 249,
-    221,
-    249, 222, 240, 250, 252, 251, 252, 252, 252, 253, 252, 254, 250, 0, 1,
-    250, 0, 8,
-    252, 0, 14, 252, 0, 32, 252, 0, 36, 252, 0, 78, 252, 0, 82, 252, 0, 100,
-    237, 0, 102,
-    237, 0, 108, 249, 0, 109, 252, 0, 112, 249, 0, 113, 252, 0, 114, 249, 0,
-    115, 252,
-    0, 116, 249, 0, 117, 252, 0, 122, 240, 49, 68, 252, 72, 252, 80, 252, 82,
-    252, 85,
-    237, 86, 249, 87, 245, 88, 249, 90, 240, 118, 252, 119, 250, 120, 250,
-    122, 250,
-    200, 252, 211, 252, 212, 252, 213, 252, 214, 252, 215, 252, 217, 252, 218,
-    249,
-    219, 249, 220, 249, 221, 249, 222, 240, 250, 252, 251, 252, 252, 252, 253,
-    252,
-    254, 250, 0, 1, 250, 0, 8, 252, 0, 14, 252, 0, 32, 252, 0, 36, 252, 0, 78,
-    252, 0, 82,
-    252, 0, 100, 237, 0, 102, 237, 0, 108, 249, 0, 109, 252, 0, 112, 249, 0,
-    113, 252,
-    0, 114, 249, 0, 115, 252, 0, 116, 249, 0, 117, 252, 0, 122, 240, 49, 68,
-    252, 72, 252,
-    80, 252, 82, 252, 85, 237, 86, 249, 87, 245, 88, 249, 90, 240, 118, 252,
-    119, 250,
-    120, 250, 122, 250, 200, 252, 211, 252, 212, 252, 213, 252, 214, 252, 215,
-    252,
-    217, 252, 218, 249, 219, 249, 220, 249, 221, 249, 222, 240, 250, 252, 251,
-    252,
-    252, 252, 253, 252, 254, 250, 0, 1, 250, 0, 8, 252, 0, 14, 252, 0, 32,
-    252, 0, 36, 252,
-    0, 78, 252, 0, 82, 252, 0, 100, 237, 0, 102, 237, 0, 108, 249, 0, 109,
-    252, 0, 112,
-    249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116, 249, 0, 117, 252, 0,
-    122, 240,
-    49, 68, 252, 72, 252, 80, 252, 82, 252, 85, 237, 86, 249, 87, 245, 88,
-    249, 90, 240,
-    118, 252, 119, 250, 120, 250, 122, 250, 200, 252, 211, 252, 212, 252, 213,
-    252,
-    214, 252, 215, 252, 217, 252, 218, 249, 219, 249, 220, 249, 221, 249, 222,
-    240,
-    250, 252, 251, 252, 252, 252, 253, 252, 254, 250, 0, 1, 250, 0, 8, 252, 0,
-    14, 252,
-    0, 32, 252, 0, 36, 252, 0, 78, 252, 0, 82, 252, 0, 100, 237, 0, 102, 237,
-    0, 108, 249,
-    0, 109, 252, 0, 112, 249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116,
-    249, 0, 117,
-    252, 0, 122, 240, 3, 45, 252, 47, 252, 22, 45, 250, 47, 250, 66, 254, 85,
-    250, 87,
-    249, 88, 252, 89, 247, 90, 245, 193, 254, 194, 254, 195, 254, 196, 254,
-    197, 254,
-    198, 254, 222, 245, 0, 2, 254, 0, 4, 254, 0, 6, 254, 0, 100, 250, 0, 102,
-    250, 0, 122,
-    245, 22, 45, 250, 47, 250, 66, 254, 85, 250, 87, 249, 88, 252, 89, 247,
-    90, 245, 193,
-    254, 194, 254, 195, 254, 196, 254, 197, 254, 198, 254, 222, 245, 0, 2,
-    254, 0, 4,
-    254, 0, 6, 254, 0, 100, 250, 0, 102, 250, 0, 122, 245, 22, 45, 250, 47,
-    250, 66, 254,
-    85, 250, 87, 249, 88, 252, 89, 247, 90, 245, 193, 254, 194, 254, 195, 254,
-    196, 254,
-    197, 254, 198, 254, 222, 245, 0, 2, 254, 0, 4, 254, 0, 6, 254, 0, 100,
-    250, 0, 102,
-    250, 0, 122, 245, 22, 45, 250, 47, 250, 66, 254, 85, 250, 87, 249, 88,
-    252, 89, 247,
-    90, 245, 193, 254, 194, 254, 195, 254, 196, 254, 197, 254, 198, 254, 222,
-    245, 0,
-    2, 254, 0, 4, 254, 0, 6, 254, 0, 100, 250, 0, 102, 250, 0, 122, 245, 22,
-    45, 250, 47,
-    250, 66, 254, 85, 250, 87, 249, 88, 252, 89, 247, 90, 245, 193, 254, 194,
-    254, 195,
-    254, 196, 254, 197, 254, 198, 254, 222, 245, 0, 2, 254, 0, 4, 254, 0, 6,
-    254, 0, 100,
-    250, 0, 102, 250, 0, 122, 245, 22, 45, 250, 47, 250, 66, 254, 85, 250, 87,
-    249, 88,
-    252, 89, 247, 90, 245, 193, 254, 194, 254, 195, 254, 196, 254, 197, 254,
-    198, 254,
-    222, 245, 0, 2, 254, 0, 4, 254, 0, 6, 254, 0, 100, 250, 0, 102, 250, 0,
-    122, 245, 13,
-    45, 250, 47, 250, 66, 250, 193, 250, 194, 250, 195, 250, 196, 250, 197,
-    250, 198,
-    250, 0, 2, 250, 0, 4, 250, 0, 6, 250, 13, 45, 250, 47, 250, 66, 250, 193,
-    250, 194,
-    250, 195, 250, 196, 250, 197, 250, 198, 250, 0, 2, 250, 0, 4, 250, 0, 6,
-    250, 13, 45,
-    250, 47, 250, 66, 250, 193, 250, 194, 250, 195, 250, 196, 250, 197, 250,
-    198, 250,
-    0, 2, 250, 0, 4, 250, 0, 6, 250, 13, 45, 250, 47, 250, 66, 250, 193, 250,
-    194, 250,
-    195, 250, 196, 250, 197, 250, 198, 250, 0, 2, 250, 0, 4, 250, 0, 6, 250,
-    65, 45, 234,
-    46, 234, 47, 234, 59, 247, 60, 247, 66, 239, 80, 243, 98, 234, 102, 234,
-    106, 254,
-    112, 234, 118, 239, 193, 239, 194, 239, 195, 239, 196, 239, 197, 239, 198,
-    239,
-    211, 243, 212, 243, 213, 243, 214, 243, 215, 243, 217, 243, 225, 234, 226,
-    234,
-    227, 234, 228, 245, 229, 234, 230, 234, 233, 234, 234, 234, 235, 234, 236,
-    234,
-    238, 254, 243, 234, 244, 234, 245, 234, 246, 234, 247, 234, 249, 234, 250,
-    239,
-    251, 239, 252, 239, 253, 239, 0, 2, 239, 0, 3, 245, 0, 4, 239, 0, 5, 245,
-    0, 6, 239,
-    0, 7, 234, 0, 21, 245, 0, 25, 234, 0, 27, 234, 0, 29, 234, 0, 49, 254, 0,
-    78, 243, 0,
-    79, 245, 0, 82, 243, 0, 83, 234, 0, 109, 239, 0, 113, 239, 0, 115, 239, 0,
-    117, 239,
-    6, 119, 254, 120, 254, 122, 252, 254, 252, 0, 1, 252, 6, 119, 254, 120,
-    254, 122,
-    252, 254, 252, 0, 1, 252, 6, 119, 254, 120, 254, 122, 252, 254, 252, 0, 1,
-    252, 6,
-    119, 254, 120, 254, 122, 252, 254, 252, 0, 1, 252, 6, 119, 254, 120, 254,
-    122, 252,
-    254, 252, 0, 1, 252, 6, 119, 254, 120, 254, 122, 252, 254, 252, 0, 1, 252,
-    4, 45, 254,
-    108, 254, 0, 57, 254, 9, 45, 254, 47, 254, 119, 252, 120, 254, 121, 252,
-    122, 254,
-    254, 254, 0, 1, 254, 9, 45, 254, 47, 254, 119, 252, 120, 254, 121, 252,
-    122, 254,
-    254, 254, 0, 1, 254, 9, 45, 254, 47, 254, 119, 252, 120, 254, 121, 252,
-    122, 254,
-    254, 254, 0, 1, 254, 9, 45, 254, 47, 254, 119, 252, 120, 254, 121, 252,
-    122, 254,
-    254, 254, 0, 1, 254, 14, 118, 255, 119, 254, 122, 254, 250, 255, 251, 255,
-    252, 255,
-    253, 255, 254, 254, 0, 1, 254, 0, 109, 255, 0, 113, 255, 0, 115, 255, 0,
-    117, 255,
-    9, 45, 250, 47, 250, 119, 254, 120, 254, 121, 252, 122, 252, 254, 252, 0,
-    1, 252,
-    9, 45, 250, 47, 250, 119, 254, 120, 254, 121, 252, 122, 252, 254, 252, 0,
-    1, 252,
-    9, 45, 250, 47, 250, 119, 254, 120, 254, 121, 252, 122, 252, 254, 252, 0,
-    1, 252,
-    9, 45, 250, 47, 250, 119, 254, 120, 254, 121, 252, 122, 252, 254, 252, 0,
-    1, 252,
-    9, 45, 250, 47, 250, 119, 254, 120, 254, 121, 252, 122, 252, 254, 252, 0,
-    1, 252,
-    95, 45, 241, 47, 241, 98, 248, 99, 248, 100, 248, 101, 248, 102, 248, 103,
-    248, 104,
-    248, 105, 248, 106, 248, 107, 248, 108, 248, 109, 248, 110, 248, 111, 248,
-    112,
-    248, 113, 248, 114, 248, 115, 248, 116, 248, 117, 248, 118, 248, 119, 245,
-    120,
-    245, 121, 243, 122, 245, 123, 248, 225, 248, 226, 248, 227, 248, 228, 248,
-    229,
-    248, 230, 248, 232, 248, 233, 248, 234, 248, 235, 248, 236, 248, 237, 248,
-    238,
-    248, 239, 248, 240, 248, 242, 248, 243, 248, 244, 248, 245, 248, 246, 248,
-    247,
-    248, 249, 248, 250, 248, 251, 248, 252, 248, 253, 248, 254, 245, 0, 1,
-    245, 0, 3,
-    248, 0, 5, 248, 0, 7, 248, 0, 9, 248, 0, 15, 248, 0, 19, 248, 0, 21, 248,
-    0, 25, 248,
-    0, 27, 248, 0, 29, 248, 0, 33, 248, 0, 37, 248, 0, 45, 248, 0, 49, 248, 0,
-    57, 248, 0,
-    60, 248, 0, 62, 248, 0, 68, 248, 0, 70, 248, 0, 72, 248, 0, 74, 248, 0,
-    79, 248, 0, 83,
-    248, 0, 87, 248, 0, 89, 248, 0, 91, 248, 0, 93, 248, 0, 97, 248, 0, 99,
-    248, 0, 101,
-    248, 0, 109, 248, 0, 113, 248, 0, 115, 248, 0, 117, 248, 0, 124, 248, 0,
-    126, 248,
-    0, 128, 248, 1, 2, 25, 248, 31, 45, 240, 47, 240, 98, 254, 102, 254, 112,
-    254, 225,
-    254, 226, 254, 227, 254, 228, 254, 229, 254, 230, 254, 233, 254, 234, 254,
-    235,
-    254, 236, 254, 243, 254, 244, 254, 245, 254, 246, 254, 247, 254, 249, 254,
-    0, 3,
-    254, 0, 5, 254, 0, 7, 254, 0, 21, 254, 0, 25, 254, 0, 27, 254, 0, 29, 254,
-    0, 79, 254,
-    0, 83, 254, 31, 45, 240, 47, 240, 98, 254, 102, 254, 112, 254, 225, 254,
-    226, 254,
-    227, 254, 228, 254, 229, 254, 230, 254, 233, 254, 234, 254, 235, 254, 236,
-    254,
-    243, 254, 244, 254, 245, 254, 246, 254, 247, 254, 249, 254, 0, 3, 254, 0,
-    5, 254,
-    0, 7, 254, 0, 21, 254, 0, 25, 254, 0, 27, 254, 0, 29, 254, 0, 79, 254, 0,
-    83, 254, 49,
-    68, 252, 72, 252, 80, 252, 82, 252, 85, 237, 86, 249, 87, 245, 88, 249,
-    90, 240, 118,
-    252, 119, 250, 120, 250, 122, 250, 200, 252, 211, 252, 212, 252, 213, 252,
-    214,
-    252, 215, 252, 217, 252, 218, 249, 219, 249, 220, 249, 221, 249, 222, 240,
-    250,
-    252, 251, 252, 252, 252, 253, 252, 254, 250, 0, 1, 250, 0, 8, 252, 0, 14,
-    252, 0, 32,
-    252, 0, 36, 252, 0, 78, 252, 0, 82, 252, 0, 100, 237, 0, 102, 237, 0, 108,
-    249, 0, 109,
-    252, 0, 112, 249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116, 249, 0,
-    117, 252,
-    0, 122, 240, 6, 119, 254, 120, 254, 122, 252, 254, 252, 0, 1, 252, 49, 68,
-    252, 72,
-    252, 80, 252, 82, 252, 85, 237, 86, 249, 87, 245, 88, 249, 90, 240, 118,
-    252, 119,
-    250, 120, 250, 122, 250, 200, 252, 211, 252, 212, 252, 213, 252, 214, 252,
-    215,
-    252, 217, 252, 218, 249, 219, 249, 220, 249, 221, 249, 222, 240, 250, 252,
-    251,
-    252, 252, 252, 253, 252, 254, 250, 0, 1, 250, 0, 8, 252, 0, 14, 252, 0,
-    32, 252, 0,
-    36, 252, 0, 78, 252, 0, 82, 252, 0, 100, 237, 0, 102, 237, 0, 108, 249, 0,
-    109, 252,
-    0, 112, 249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116, 249, 0, 117,
-    252, 0, 122,
-    240, 6, 119, 254, 120, 254, 122, 252, 254, 252, 0, 1, 252, 49, 68, 252,
-    72, 252, 80,
-    252, 82, 252, 85, 237, 86, 249, 87, 245, 88, 249, 90, 240, 118, 252, 119,
-    250, 120,
-    250, 122, 250, 200, 252, 211, 252, 212, 252, 213, 252, 214, 252, 215, 252,
-    217,
-    252, 218, 249, 219, 249, 220, 249, 221, 249, 222, 240, 250, 252, 251, 252,
-    252,
-    252, 253, 252, 254, 250, 0, 1, 250, 0, 8, 252, 0, 14, 252, 0, 32, 252, 0,
-    36, 252, 0,
-    78, 252, 0, 82, 252, 0, 100, 237, 0, 102, 237, 0, 108, 249, 0, 109, 252,
-    0, 112, 249,
-    0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116, 249, 0, 117, 252, 0, 122,
-    240, 6, 119,
-    254, 120, 254, 122, 252, 254, 252, 0, 1, 252, 3, 45, 252, 47, 252, 4, 45,
-    254, 108,
-    254, 0, 57, 254, 3, 45, 252, 47, 252, 4, 45, 254, 108, 254, 0, 57, 254,
-    18, 45, 245,
-    47, 245, 66, 250, 87, 245, 88, 250, 90, 242, 193, 250, 194, 250, 195, 250,
-    196, 250,
-    197, 250, 198, 250, 222, 242, 0, 2, 250, 0, 4, 250, 0, 6, 250, 0, 122,
-    242, 18, 45,
-    245, 47, 245, 66, 250, 87, 245, 88, 250, 90, 242, 193, 250, 194, 250, 195,
-    250, 196,
-    250, 197, 250, 198, 250, 222, 242, 0, 2, 250, 0, 4, 250, 0, 6, 250, 0,
-    122, 242, 9,
-    45, 254, 47, 254, 119, 252, 120, 254, 121, 252, 122, 254, 254, 254, 0, 1,
-    254, 9,
-    45, 254, 47, 254, 119, 252, 120, 254, 121, 252, 122, 254, 254, 254, 0, 1,
-    254, 9,
-    45, 254, 47, 254, 119, 252, 120, 254, 121, 252, 122, 254, 254, 254, 0, 1,
-    254, 9,
-    45, 254, 47, 254, 119, 252, 120, 254, 121, 252, 122, 254, 254, 254, 0, 1,
-    254, 5,
-    115, 255, 0, 87, 255, 0, 89, 255, 0, 91, 255, 5, 115, 255, 0, 87, 255, 0,
-    89, 255, 0,
-    91, 255, 40, 80, 249, 102, 250, 112, 250, 118, 252, 122, 249, 211, 249,
-    212, 249,
-    213, 249, 214, 249, 215, 249, 217, 249, 233, 250, 234, 250, 235, 250, 236,
-    250,
-    243, 250, 244, 250, 245, 250, 246, 250, 247, 250, 249, 250, 250, 252, 251,
-    252,
-    252, 252, 253, 252, 254, 249, 0, 1, 249, 0, 21, 250, 0, 25, 250, 0, 27,
-    250, 0, 29,
-    250, 0, 78, 249, 0, 79, 250, 0, 82, 249, 0, 83, 250, 0, 109, 252, 0, 113,
-    252, 0, 115,
-    252, 0, 117, 252, 19, 102, 254, 112, 254, 233, 254, 234, 254, 235, 254,
-    236, 254,
-    243, 254, 244, 254, 245, 254, 246, 254, 247, 254, 249, 254, 0, 21, 254, 0,
-    25, 254,
-    0, 27, 254, 0, 29, 254, 0, 79, 254, 0, 83, 254, 14, 85, 239, 87, 239, 88,
-    245, 90, 234,
-    122, 252, 222, 234, 254, 252, 0, 1, 252, 0, 100, 239, 0, 102, 239, 0, 122,
-    234, 1,
-    32, 25, 230, 1, 32, 29, 234, 14, 85, 239, 87, 239, 88, 245, 90, 234, 122,
-    252, 222,
-    234, 254, 252, 0, 1, 252, 0, 100, 239, 0, 102, 239, 0, 122, 234, 1, 32,
-    25, 230, 1,
-    32, 29, 234, 14, 85, 239, 87, 239, 88, 245, 90, 234, 122, 252, 222, 234,
-    254, 252,
-    0, 1, 252, 0, 100, 239, 0, 102, 239, 0, 122, 234, 1, 32, 25, 230, 1, 32,
-    29, 234, 14,
-    85, 239, 87, 239, 88, 245, 90, 234, 122, 252, 222, 234, 254, 252, 0, 1,
-    252, 0, 100,
-    239, 0, 102, 239, 0, 122, 234, 1, 32, 25, 230, 1, 32, 29, 234, 14, 118,
-    255, 119, 254,
-    122, 254, 250, 255, 251, 255, 252, 255, 253, 255, 254, 254, 0, 1, 254, 0,
-    109, 255,
-    0, 113, 255, 0, 115, 255, 0, 117, 255, 14, 118, 255, 119, 254, 122, 254,
-    250, 255,
-    251, 255, 252, 255, 253, 255, 254, 254, 0, 1, 254, 0, 109, 255, 0, 113,
-    255, 0, 115,
-    255, 0, 117, 255, 14, 118, 255, 119, 254, 122, 254, 250, 255, 251, 255,
-    252, 255,
-    253, 255, 254, 254, 0, 1, 254, 0, 109, 255, 0, 113, 255, 0, 115, 255, 0,
-    117, 255,
-    22, 45, 250, 47, 250, 66, 254, 85, 250, 87, 249, 88, 252, 89, 247, 90,
-    245, 193, 254,
-    194, 254, 195, 254, 196, 254, 197, 254, 198, 254, 222, 245, 0, 2, 254, 0,
-    4, 254,
-    0, 6, 254, 0, 100, 250, 0, 102, 250, 0, 122, 245, 9, 45, 250, 47, 250,
-    119, 254, 120,
-    254, 121, 252, 122, 252, 254, 252, 0, 1, 252, 22, 45, 250, 47, 250, 66,
-    254, 85, 250,
-    87, 249, 88, 252, 89, 247, 90, 245, 193, 254, 194, 254, 195, 254, 196,
-    254, 197,
-    254, 198, 254, 222, 245, 0, 2, 254, 0, 4, 254, 0, 6, 254, 0, 100, 250, 0,
-    102, 250,
-    0, 122, 245, 9, 45, 250, 47, 250, 119, 254, 120, 254, 121, 252, 122, 252,
-    254, 252,
-    0, 1, 252, 27, 80, 254, 85, 252, 86, 250, 87, 249, 88, 252, 90, 249, 211,
-    254, 212,
-    254, 213, 254, 214, 254, 215, 254, 217, 254, 218, 250, 219, 250, 220, 250,
-    221,
-    250, 222, 249, 0, 78, 254, 0, 82, 254, 0, 100, 252, 0, 102, 252, 0, 108,
-    250, 0, 112,
-    250, 0, 114, 250, 0, 116, 250, 0, 122, 249, 50, 45, 249, 47, 249, 59, 5,
-    60, 5, 98,
-    255, 106, 3, 108, 3, 109, 3, 110, 4, 111, 4, 113, 5, 117, 7, 118, 3, 119,
-    5, 122, 5,
-    225, 255, 226, 255, 227, 255, 228, 255, 229, 255, 230, 255, 237, 3, 238,
-    3, 239,
-    3, 240, 3, 242, 4, 250, 3, 251, 3, 252, 3, 253, 3, 254, 5, 0, 1, 5, 0, 3,
-    255, 0, 5, 255,
-    0, 7, 255, 0, 45, 3, 0, 49, 3, 0, 57, 3, 0, 60, 3, 0, 62, 3, 0, 68, 3, 0,
-    70, 4, 0, 72, 4,
-    0, 74, 4, 0, 101, 7, 0, 109, 3, 0, 113, 3, 0, 115, 3, 0, 117, 3, 27, 80,
-    254, 85, 252,
-    86, 250, 87, 249, 88, 252, 90, 249, 211, 254, 212, 254, 213, 254, 214,
-    254, 215,
-    254, 217, 254, 218, 250, 219, 250, 220, 250, 221, 250, 222, 249, 0, 78,
-    254, 0, 82,
-    254, 0, 100, 252, 0, 102, 252, 0, 108, 250, 0, 112, 250, 0, 114, 250, 0,
-    116, 250,
-    0, 122, 249, 50, 45, 249, 47, 249, 59, 5, 60, 5, 98, 255, 106, 3, 108, 3,
-    109, 3, 110,
-    4, 111, 4, 113, 5, 117, 7, 118, 3, 119, 5, 122, 5, 225, 255, 226, 255,
-    227, 255, 228,
-    255, 229, 255, 230, 255, 237, 3, 238, 3, 239, 3, 240, 3, 242, 4, 250, 3,
-    251, 3, 252,
-    3, 253, 3, 254, 5, 0, 1, 5, 0, 3, 255, 0, 5, 255, 0, 7, 255, 0, 45, 3, 0,
-    49, 3, 0, 57, 3,
-    0, 60, 3, 0, 62, 3, 0, 68, 3, 0, 70, 4, 0, 72, 4, 0, 74, 4, 0, 101, 7, 0,
-    109, 3, 0, 113,
-    3, 0, 115, 3, 0, 117, 3, 27, 80, 254, 85, 252, 86, 250, 87, 249, 88, 252,
-    90, 249, 211,
-    254, 212, 254, 213, 254, 214, 254, 215, 254, 217, 254, 218, 250, 219, 250,
-    220,
-    250, 221, 250, 222, 249, 0, 78, 254, 0, 82, 254, 0, 100, 252, 0, 102, 252,
-    0, 108,
-    250, 0, 112, 250, 0, 114, 250, 0, 116, 250, 0, 122, 249, 50, 45, 249, 47,
-    249, 59,
-    5, 60, 5, 98, 255, 106, 3, 108, 3, 109, 3, 110, 4, 111, 4, 113, 5, 117, 7,
-    118, 3, 119,
-    5, 122, 5, 225, 255, 226, 255, 227, 255, 228, 255, 229, 255, 230, 255,
-    237, 3, 238,
-    3, 239, 3, 240, 3, 242, 4, 250, 3, 251, 3, 252, 3, 253, 3, 254, 5, 0, 1,
-    5, 0, 3, 255,
-    0, 5, 255, 0, 7, 255, 0, 45, 3, 0, 49, 3, 0, 57, 3, 0, 60, 3, 0, 62, 3, 0,
-    68, 3, 0, 70, 4,
-    0, 72, 4, 0, 74, 4, 0, 101, 7, 0, 109, 3, 0, 113, 3, 0, 115, 3, 0, 117, 3,
-    3, 45, 254, 47,
-    254, 4, 45, 254, 47, 254, 120, 252, 3, 45, 254, 47, 254, 4, 45, 254, 47,
-    254, 120,
-    252, 3, 45, 254, 47, 254, 4, 45, 254, 47, 254, 120, 252, 70, 45, 237, 46,
-    234, 47,
-    237, 59, 254, 60, 254, 66, 237, 80, 250, 98, 237, 102, 237, 112, 237, 115,
-    237, 118,
-    237, 120, 237, 122, 237, 193, 237, 194, 237, 195, 237, 196, 237, 197, 237,
-    198,
-    237, 211, 250, 212, 250, 213, 250, 214, 250, 215, 250, 217, 250, 225, 237,
-    226,
-    237, 227, 237, 228, 247, 229, 237, 230, 237, 233, 247, 234, 237, 235, 237,
-    236,
-    237, 243, 237, 244, 237, 245, 237, 246, 247, 247, 237, 249, 237, 250, 237,
-    251,
-    237, 252, 237, 253, 237, 254, 237, 0, 1, 247, 0, 2, 237, 0, 3, 247, 0, 4,
-    237, 0, 5,
-    247, 0, 6, 237, 0, 7, 237, 0, 21, 247, 0, 25, 237, 0, 27, 237, 0, 29, 237,
-    0, 78, 250,
-    0, 79, 247, 0, 82, 250, 0, 83, 237, 0, 87, 237, 0, 89, 237, 0, 91, 237, 0,
-    109, 247,
-    0, 113, 237, 0, 115, 237, 0, 117, 237, 70, 45, 237, 46, 234, 47, 237, 59,
-    254, 60,
-    254, 66, 237, 80, 250, 98, 237, 102, 237, 112, 237, 115, 237, 118, 237,
-    120, 237,
-    122, 237, 193, 237, 194, 237, 195, 237, 196, 237, 197, 237, 198, 237, 211,
-    250,
-    212, 250, 213, 250, 214, 250, 215, 250, 217, 250, 225, 237, 226, 237, 227,
-    237,
-    228, 247, 229, 237, 230, 237, 233, 247, 234, 237, 235, 237, 236, 237, 243,
-    237,
-    244, 237, 245, 237, 246, 247, 247, 237, 249, 237, 250, 237, 251, 237, 252,
-    237,
-    253, 237, 254, 237, 0, 1, 247, 0, 2, 237, 0, 3, 247, 0, 4, 237, 0, 5, 247,
-    0, 6, 237,
-    0, 7, 237, 0, 21, 247, 0, 25, 237, 0, 27, 237, 0, 29, 237, 0, 78, 250, 0,
-    79, 247, 0,
-    82, 250, 0, 83, 237, 0, 87, 237, 0, 89, 237, 0, 91, 237, 0, 109, 247, 0,
-    113, 237, 0,
-    115, 237, 0, 117, 237, 13, 45, 250, 47, 250, 66, 250, 193, 250, 194, 250,
-    195, 250,
-    196, 250, 197, 250, 198, 250, 0, 2, 250, 0, 4, 250, 0, 6, 250, 13, 45,
-    250, 47, 250,
-    66, 250, 193, 250, 194, 250, 195, 250, 196, 250, 197, 250, 198, 250, 0, 2,
-    250, 0,
-    4, 250, 0, 6, 250, 13, 45, 250, 47, 250, 66, 250, 193, 250, 194, 250, 195,
-    250, 196,
-    250, 197, 250, 198, 250, 0, 2, 250, 0, 4, 250, 0, 6, 250, 13, 45, 250, 47,
-    250, 66,
-    250, 193, 250, 194, 250, 195, 250, 196, 250, 197, 250, 198, 250, 0, 2,
-    250, 0, 4,
-    250, 0, 6, 250, 65, 45, 234, 46, 234, 47, 234, 59, 247, 60, 247, 66, 239,
-    80, 243,
-    98, 234, 102, 234, 106, 254, 112, 234, 118, 239, 193, 239, 194, 239, 195,
-    239, 196,
-    239, 197, 239, 198, 239, 211, 243, 212, 243, 213, 243, 214, 243, 215, 243,
-    217,
-    243, 225, 234, 226, 234, 227, 234, 228, 245, 229, 234, 230, 234, 233, 234,
-    234,
-    234, 235, 234, 236, 234, 238, 254, 243, 234, 244, 234, 245, 234, 246, 234,
-    247,
-    234, 249, 234, 250, 239, 251, 239, 252, 239, 253, 239, 0, 2, 239, 0, 3,
-    245, 0, 4,
-    239, 0, 5, 245, 0, 6, 239, 0, 7, 234, 0, 21, 245, 0, 25, 234, 0, 27, 234,
-    0, 29, 234,
-    0, 49, 254, 0, 78, 243, 0, 79, 234, 0, 82, 243, 0, 83, 234, 0, 109, 239,
-    0, 113, 239,
-    0, 115, 239, 0, 117, 239, 19, 102, 254, 112, 254, 233, 254, 234, 254, 235,
-    254, 236,
-    254, 243, 254, 244, 254, 245, 254, 246, 254, 247, 254, 249, 254, 0, 21,
-    254, 0, 25,
-    254, 0, 27, 254, 0, 29, 254, 0, 79, 254, 0, 83, 254, 19, 102, 254, 112,
-    254, 233, 254,
-    234, 254, 235, 254, 236, 254, 243, 254, 244, 254, 245, 254, 246, 254, 247,
-    254,
-    249, 254, 0, 21, 254, 0, 25, 254, 0, 27, 254, 0, 29, 254, 0, 79, 254, 0,
-    83, 254, 19,
-    102, 254, 112, 254, 233, 254, 234, 254, 235, 254, 236, 254, 243, 254, 244,
-    254,
-    245, 254, 246, 254, 247, 254, 249, 254, 0, 21, 254, 0, 25, 254, 0, 27,
-    254, 0, 29,
-    254, 0, 79, 254, 0, 83, 254, 3, 45, 254, 47, 254, 4, 45, 254, 47, 254,
-    120, 252, 2,
-    1, 32, 24, 247, 14, 33, 245, 101, 249, 115, 249, 116, 249, 0, 19, 249, 0,
-    87, 249,
-    0, 89, 249, 0, 91, 249, 0, 93, 249, 0, 97, 249, 0, 99, 249, 1, 2, 25, 249,
-    1, 32, 25,
-    247, 2, 33, 250
-};
-static afm_cuint16 afm_Helvetica_highchars_index[] = {  /* 220 */
-    161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176,
-    177,
-    178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192,
-    193,
-    194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208,
-    209,
-    210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224,
-    225,
-    226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240,
-    241,
-    242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256,
-    257,
-    258, 259, 260, 261, 262, 263, 268, 269, 270, 271, 272, 273, 274, 275, 278,
-    279,
-    280, 281, 282, 283, 286, 287, 290, 291, 298, 299, 302, 303, 304, 305, 310,
-    311,
-    313, 314, 315, 316, 317, 318, 321, 322, 323, 324, 325, 326, 327, 328, 332,
-    333,
-    336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 350, 351, 352,
-    353,
-    354, 355, 356, 357, 362, 363, 366, 367, 368, 369, 370, 371, 376, 377, 378,
-    379,
-    380, 381, 382, 402, 536, 537, 710, 711, 728, 729, 730, 731, 732, 733,
-    8211, 8212,
-    8216, 8217, 8218, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8249,
-    8250,
-    8260, 8364, 8482, 8706, 8710, 8721, 8722, 8730, 8800, 8804, 8805, 9674,
-    63171,
-    64257, 64258
-};
-static afm_cunicode afm_Helvetica_ligatures[] = {   /* 3 */
-    102, 105, 64257
-};
-
-
-/* ------------------------------------------------------------------*/
-/* FontName: Helvetica-Bold */
-/* FullName: Helvetica Bold */
-/* FamilyName: Helvetica */
-static afm_cuint8 afm_Helvetica_Bold_widths[] = {   /* 315 */
-    46, 56, 79, 93, 93, 148, 120, 40, 56, 56, 65, 97, 46, 56, 46, 46, 93, 93,
-    93, 93, 93,
-    93, 93, 93, 93, 93, 56, 56, 97, 97, 97, 102, 163, 120, 120, 120, 120, 111,
-    102, 130,
-    120, 46, 93, 120, 102, 139, 120, 130, 111, 130, 120, 111, 102, 120, 111,
-    157, 111,
-    111, 102, 56, 46, 56, 97, 93, 56, 93, 102, 93, 102, 93, 56, 102, 102, 46,
-    46, 93, 46,
-    148, 102, 102, 102, 102, 65, 93, 56, 102, 93, 130, 93, 93, 83, 65, 47, 65,
-    97, 56,
-    93, 93, 93, 93, 47, 93, 56, 123, 62, 93, 97, 123, 56, 67, 97, 56, 56, 56,
-    102, 93, 46,
-    56, 56, 61, 93, 139, 139, 139, 102, 120, 120, 120, 120, 120, 120, 167,
-    120, 111,
-    111, 111, 111, 46, 46, 46, 46, 120, 120, 130, 130, 130, 130, 130, 97, 130,
-    120, 120,
-    120, 120, 111, 111, 102, 93, 93, 93, 93, 93, 93, 148, 93, 93, 93, 93, 93,
-    46, 46, 46,
-    46, 102, 102, 102, 102, 102, 102, 102, 97, 102, 102, 102, 102, 102, 93,
-    102, 93,
-    120, 93, 120, 93, 120, 93, 120, 93, 120, 93, 120, 124, 120, 102, 111, 93,
-    111, 93,
-    111, 93, 111, 93, 130, 102, 130, 102, 46, 46, 46, 46, 46, 46, 120, 93,
-    102, 46, 102,
-    46, 102, 67, 102, 46, 120, 102, 120, 102, 120, 102, 130, 102, 130, 102,
-    167, 157,
-    120, 65, 120, 65, 120, 65, 111, 93, 111, 93, 111, 93, 102, 56, 102, 65,
-    120, 102,
-    120, 102, 120, 102, 120, 102, 111, 102, 83, 102, 83, 102, 83, 93, 111, 93,
-    56, 56,
-    56, 56, 56, 56, 56, 56, 93, 167, 46, 46, 46, 83, 83, 83, 93, 93, 58, 167,
-    167, 56, 56,
-    28, 93, 167, 82, 102, 100, 97, 92, 92, 92, 92, 82, 42, 102, 102
-};
-static afm_sint16 afm_Helvetica_Bold_kerning_index[] = {    /* 315 */
-    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 51, 54, 0, 0,
-    0, 0, 0, 57, 172, 0, 218, 0, 257, 0, 0, 0, 308, 358, 450, 0, 0, 485, 534,
-    627, 654, 0,
-    716, 874, 902, 1051, 0, 1199, 0, 0, 0, 0, 0, 0, 0, 1338, 1358, 1401, 1427,
-    1444, 1462,
-    1517, 1548, 0, 0, 1556, 1577, 1587, 1617, 1649, 1663, 0, 1671, 1752, 0, 0,
-    1755,
-    1803, 1828, 1851, 1921, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1944, 2059, 2174, 2289, 2404, 2519, 0,
-    0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 2634, 2683, 2732, 2781, 2830, 0, 2879, 2928, 2956,
-    2984, 3012,
-    3040, 0, 0, 3179, 3199, 3219, 3239, 3259, 3279, 0, 3299, 3325, 3343, 3361,
-    3379,
-    0, 0, 0, 0, 0, 3397, 3429, 3443, 3457, 3471, 3485, 0, 3499, 0, 0, 0, 0,
-    3513, 0, 3583,
-    3653, 3768, 3788, 3903, 3923, 4038, 0, 4058, 0, 4084, 4110, 0, 4149, 4188,
-    0, 4205,
-    0, 4223, 0, 4241, 0, 4259, 0, 4277, 0, 4308, 0, 0, 0, 0, 0, 0, 4339, 4431,
-    4452, 4487,
-    4497, 4532, 0, 0, 4542, 4577, 0, 4587, 0, 4619, 0, 4651, 4683, 4732, 4746,
-    4795,
-    0, 0, 4809, 4871, 4952, 5014, 5095, 5157, 0, 5238, 0, 5241, 0, 5244, 5247,
-    0, 5405,
-    0, 5563, 0, 5591, 0, 5619, 0, 5647, 0, 5675, 0, 5814, 0, 5837, 0, 5860, 0,
-    0, 5883,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5886, 5891, 0, 0, 5942, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0
-};
-static afm_cuint8 afm_Helvetica_Bold_kerning_data[] = { /* 5945 */
-    42, 11, 85, 240, 87, 244, 88, 244, 90, 237, 222, 237, 0, 100, 240, 0, 102,
-    240, 0,
-    122, 237, 1, 32, 24, 247, 1, 32, 28, 244, 4, 33, 250, 1, 32, 25, 237, 1,
-    32, 29, 237,
-    4, 33, 250, 1, 32, 25, 237, 1, 32, 29, 237, 2, 33, 250, 2, 33, 250, 49,
-    68, 250, 72,
-    249, 80, 250, 82, 250, 85, 242, 86, 249, 87, 244, 88, 247, 90, 239, 118,
-    252, 119,
-    250, 120, 252, 122, 252, 200, 250, 211, 250, 212, 250, 213, 250, 214, 250,
-    215,
-    250, 217, 250, 218, 249, 219, 249, 220, 249, 221, 249, 222, 239, 250, 252,
-    251,
-    252, 252, 252, 253, 252, 254, 252, 0, 1, 252, 0, 8, 250, 0, 14, 250, 0,
-    32, 249, 0,
-    36, 249, 0, 78, 250, 0, 82, 250, 0, 100, 242, 0, 102, 242, 0, 108, 249, 0,
-    109, 252,
-    0, 112, 249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116, 249, 0, 117,
-    252, 0, 122,
-    239, 20, 66, 252, 86, 255, 193, 252, 194, 252, 195, 252, 196, 252, 197,
-    252, 198,
-    252, 218, 255, 219, 255, 220, 255, 221, 255, 0, 2, 252, 0, 4, 252, 0, 6,
-    252, 0, 108,
-    255, 0, 112, 255, 0, 114, 255, 0, 116, 255, 18, 45, 252, 47, 252, 66, 250,
-    87, 250,
-    88, 250, 90, 245, 193, 250, 194, 250, 195, 250, 196, 250, 197, 250, 198,
-    250, 222,
-    245, 0, 2, 250, 0, 4, 250, 0, 6, 250, 0, 122, 245, 23, 45, 240, 47, 240,
-    66, 244, 98,
-    254, 193, 244, 194, 244, 195, 244, 196, 244, 197, 244, 198, 244, 225, 254,
-    226,
-    254, 227, 254, 228, 254, 229, 254, 230, 254, 0, 2, 244, 0, 3, 254, 0, 4,
-    244, 0, 5,
-    254, 0, 6, 244, 0, 7, 254, 22, 45, 254, 47, 254, 66, 254, 118, 254, 193,
-    254, 194,
-    254, 195, 254, 196, 254, 197, 254, 198, 254, 250, 254, 251, 254, 252, 254,
-    253,
-    254, 0, 2, 254, 0, 4, 254, 0, 6, 254, 0, 109, 254, 0, 113, 254, 0, 115,
-    254, 0, 117,
-    254, 40, 80, 252, 102, 254, 112, 251, 118, 252, 122, 250, 211, 252, 212,
-    252, 213,
-    252, 214, 252, 215, 252, 217, 252, 233, 254, 234, 254, 235, 254, 236, 254,
-    243,
-    251, 244, 251, 245, 251, 246, 251, 247, 251, 249, 251, 250, 252, 251, 252,
-    252,
-    252, 253, 252, 254, 250, 0, 1, 250, 0, 21, 254, 0, 25, 254, 0, 27, 254, 0,
-    29, 254,
-    0, 78, 252, 0, 79, 251, 0, 82, 252, 0, 83, 251, 0, 109, 252, 0, 113, 252,
-    0, 115, 252,
-    0, 117, 252, 14, 85, 242, 87, 239, 88, 244, 90, 237, 122, 252, 222, 237,
-    254, 252,
-    0, 1, 252, 0, 100, 242, 0, 102, 242, 0, 122, 237, 1, 32, 25, 234, 1, 32,
-    29, 234, 22,
-    45, 250, 47, 250, 66, 249, 85, 250, 87, 249, 88, 249, 89, 249, 90, 245,
-    193, 249,
-    194, 249, 195, 249, 196, 249, 197, 249, 198, 249, 222, 245, 0, 2, 249, 0,
-    4, 249,
-    0, 6, 249, 0, 100, 250, 0, 102, 250, 0, 122, 245, 41, 45, 237, 47, 237,
-    66, 240, 98,
-    252, 102, 252, 112, 250, 193, 240, 194, 240, 195, 240, 196, 240, 197, 240,
-    198,
-    240, 225, 252, 226, 252, 227, 252, 228, 252, 229, 252, 230, 252, 233, 252,
-    234,
-    252, 235, 252, 236, 252, 243, 250, 244, 250, 245, 250, 246, 250, 247, 250,
-    249,
-    250, 0, 2, 240, 0, 3, 252, 0, 4, 240, 0, 5, 252, 0, 6, 240, 0, 7, 252, 0,
-    21, 252, 0, 25,
-    252, 0, 27, 252, 0, 29, 252, 0, 79, 250, 0, 83, 250, 12, 45, 3, 47, 3, 86,
-    255, 218,
-    255, 219, 255, 220, 255, 221, 255, 0, 108, 255, 0, 112, 255, 0, 114, 255,
-    0, 116,
-    255, 27, 80, 254, 85, 254, 86, 254, 87, 249, 88, 250, 90, 249, 211, 254,
-    212, 254,
-    213, 254, 214, 254, 215, 254, 217, 254, 218, 254, 219, 254, 220, 254, 221,
-    254,
-    222, 249, 0, 78, 254, 0, 82, 254, 0, 100, 254, 0, 102, 254, 0, 108, 254,
-    0, 112, 254,
-    0, 114, 254, 0, 116, 254, 0, 122, 249, 69, 45, 244, 46, 237, 47, 244, 59,
-    250, 60,
-    250, 66, 242, 80, 250, 98, 244, 102, 247, 112, 244, 115, 244, 118, 242,
-    120, 247,
-    122, 247, 193, 242, 194, 242, 195, 242, 196, 242, 197, 242, 198, 242, 211,
-    250,
-    212, 250, 213, 250, 214, 250, 215, 250, 217, 250, 225, 244, 226, 244, 227,
-    244,
-    228, 244, 229, 244, 230, 244, 233, 247, 234, 247, 235, 247, 236, 247, 243,
-    244,
-    244, 244, 245, 244, 246, 244, 247, 244, 249, 244, 250, 242, 251, 242, 252,
-    242,
-    253, 242, 254, 247, 0, 1, 247, 0, 2, 242, 0, 3, 244, 0, 4, 242, 0, 5, 244,
-    0, 6, 242,
-    0, 7, 244, 0, 21, 247, 0, 25, 247, 0, 27, 247, 0, 29, 247, 0, 78, 250, 0,
-    79, 244, 0,
-    82, 250, 0, 83, 244, 0, 87, 244, 0, 89, 244, 0, 109, 242, 0, 113, 242, 0,
-    115, 242,
-    0, 117, 242, 13, 45, 252, 47, 252, 66, 249, 193, 249, 194, 249, 195, 249,
-    196, 249,
-    197, 249, 198, 249, 0, 2, 249, 0, 4, 249, 0, 6, 249, 65, 45, 237, 46, 244,
-    47, 237,
-    59, 250, 60, 250, 66, 244, 72, 249, 80, 249, 98, 247, 102, 249, 112, 242,
-    118, 247,
-    193, 244, 194, 244, 195, 244, 196, 244, 197, 244, 198, 244, 211, 249, 212,
-    249,
-    213, 249, 214, 249, 215, 249, 217, 249, 225, 247, 226, 247, 227, 247, 228,
-    247,
-    229, 247, 230, 247, 233, 249, 234, 249, 235, 249, 236, 249, 243, 242, 244,
-    242,
-    245, 242, 246, 242, 247, 242, 249, 242, 250, 247, 251, 247, 252, 247, 253,
-    247,
-    0, 2, 244, 0, 3, 247, 0, 4, 244, 0, 5, 247, 0, 6, 244, 0, 7, 247, 0, 21,
-    249, 0, 25, 249,
-    0, 27, 249, 0, 29, 249, 0, 32, 249, 0, 36, 249, 0, 78, 249, 0, 79, 242, 0,
-    82, 249, 0,
-    83, 242, 0, 109, 247, 0, 113, 247, 0, 115, 247, 0, 117, 247, 65, 45, 244,
-    46, 250,
-    47, 244, 59, 255, 60, 255, 66, 247, 80, 254, 98, 250, 102, 251, 112, 247,
-    118, 249,
-    122, 254, 193, 247, 194, 247, 195, 247, 196, 247, 197, 247, 198, 247, 211,
-    254,
-    212, 254, 213, 254, 214, 254, 215, 254, 217, 254, 225, 250, 226, 250, 227,
-    250,
-    228, 250, 229, 250, 230, 250, 233, 251, 234, 251, 235, 251, 236, 251, 243,
-    247,
-    244, 247, 245, 247, 246, 247, 247, 247, 249, 247, 250, 249, 251, 249, 252,
-    249,
-    253, 249, 254, 254, 0, 1, 254, 0, 2, 247, 0, 3, 250, 0, 4, 247, 0, 5, 250,
-    0, 6, 247,
-    0, 7, 250, 0, 21, 251, 0, 25, 251, 0, 27, 251, 0, 29, 251, 0, 78, 254, 0,
-    79, 247, 0,
-    82, 254, 0, 83, 247, 0, 109, 249, 0, 113, 249, 0, 115, 249, 0, 117, 249,
-    61, 45, 240,
-    47, 240, 59, 249, 60, 249, 66, 239, 80, 245, 98, 242, 102, 244, 112, 240,
-    118, 240,
-    193, 239, 194, 239, 195, 239, 196, 239, 197, 239, 198, 239, 211, 245, 212,
-    245,
-    213, 245, 214, 245, 215, 245, 217, 245, 225, 242, 226, 242, 227, 242, 228,
-    242,
-    229, 242, 230, 242, 233, 244, 234, 244, 235, 244, 236, 244, 243, 240, 244,
-    240,
-    245, 240, 246, 240, 247, 240, 249, 240, 250, 240, 251, 240, 252, 240, 253,
-    240,
-    0, 2, 239, 0, 3, 242, 0, 4, 239, 0, 5, 242, 0, 6, 239, 0, 7, 242, 0, 21,
-    244, 0, 25, 244,
-    0, 27, 244, 0, 29, 244, 0, 78, 245, 0, 79, 240, 0, 82, 245, 0, 83, 240, 0,
-    109, 240,
-    0, 113, 240, 0, 115, 240, 0, 117, 240, 9, 104, 255, 119, 254, 120, 254,
-    122, 254,
-    254, 254, 0, 1, 254, 0, 33, 255, 0, 37, 255, 18, 109, 255, 118, 254, 119,
-    254, 122,
-    254, 250, 254, 251, 254, 252, 254, 253, 254, 254, 254, 0, 1, 254, 0, 60,
-    255, 0, 62,
-    255, 0, 68, 255, 0, 109, 254, 0, 113, 254, 0, 115, 254, 0, 117, 254, 11,
-    105, 255,
-    108, 254, 109, 254, 122, 255, 254, 255, 0, 1, 255, 0, 57, 254, 0, 60, 254,
-    0, 62, 254,
-    0, 68, 254, 8, 101, 255, 119, 254, 120, 254, 122, 254, 254, 254, 0, 1,
-    254, 0, 19,
-    255, 9, 45, 2, 47, 3, 119, 254, 120, 254, 121, 254, 122, 254, 254, 254, 0,
-    1, 254,
-    23, 45, 255, 47, 255, 102, 255, 112, 254, 233, 255, 234, 255, 235, 255,
-    236, 255,
-    243, 254, 244, 254, 245, 254, 246, 254, 247, 254, 249, 254, 0, 21, 255, 0,
-    25, 255,
-    0, 27, 255, 0, 29, 255, 0, 79, 254, 0, 83, 254, 1, 32, 25, 5, 1, 32, 29,
-    5, 13, 102, 2,
-    104, 255, 233, 2, 234, 2, 235, 2, 236, 2, 0, 21, 2, 0, 25, 2, 0, 27, 2, 0,
-    29, 2, 0, 33,
-    255, 0, 37, 255, 4, 122, 254, 254, 254, 0, 1, 254, 10, 112, 254, 243, 254,
-    244, 254,
-    245, 254, 246, 254, 247, 254, 249, 254, 0, 79, 254, 0, 83, 254, 5, 120,
-    254, 122,
-    254, 254, 254, 0, 1, 254, 13, 118, 254, 122, 252, 250, 254, 251, 254, 252,
-    254, 253,
-    254, 254, 252, 0, 1, 252, 0, 109, 254, 0, 113, 254, 0, 115, 254, 0, 117,
-    254, 14, 118,
-    255, 119, 250, 122, 254, 250, 255, 251, 255, 252, 255, 253, 255, 254, 254,
-    0, 1,
-    254, 0, 109, 255, 0, 113, 255, 0, 115, 255, 0, 117, 255, 7, 119, 254, 120,
-    254, 121,
-    252, 122, 254, 254, 254, 0, 1, 254, 4, 122, 254, 254, 254, 0, 1, 254, 34,
-    45, 247,
-    46, 254, 47, 247, 100, 254, 101, 254, 104, 254, 112, 254, 114, 254, 116,
-    254, 117,
-    3, 119, 2, 122, 2, 232, 254, 243, 254, 244, 254, 245, 254, 246, 254, 247,
-    254, 249,
-    254, 254, 2, 0, 1, 2, 0, 9, 254, 0, 15, 254, 0, 19, 254, 0, 33, 254, 0,
-    37, 254, 0, 79,
-    254, 0, 83, 254, 0, 93, 254, 0, 97, 254, 0, 99, 254, 0, 101, 3, 1, 2, 25,
-    254, 2, 120,
-    254, 22, 45, 244, 47, 244, 98, 254, 112, 252, 225, 254, 226, 254, 227,
-    254, 228,
-    254, 229, 254, 230, 254, 243, 252, 244, 252, 245, 252, 246, 252, 247, 252,
-    249,
-    252, 0, 3, 254, 0, 5, 254, 0, 7, 254, 0, 79, 252, 0, 83, 252, 12, 45, 250,
-    47, 250, 112,
-    254, 243, 254, 244, 254, 245, 254, 246, 254, 247, 254, 249, 254, 0, 79,
-    254, 0, 83,
-    254, 10, 102, 255, 233, 255, 234, 255, 235, 255, 236, 255, 0, 21, 255, 0,
-    25, 255,
-    0, 27, 255, 0, 29, 255, 31, 45, 244, 47, 244, 98, 252, 102, 255, 112, 253,
-    225, 252,
-    226, 252, 227, 252, 228, 252, 229, 252, 230, 252, 233, 255, 234, 255, 235,
-    255,
-    236, 255, 243, 253, 244, 253, 245, 253, 246, 253, 247, 253, 249, 253, 0,
-    3, 252,
-    0, 5, 252, 0, 7, 252, 0, 21, 255, 0, 25, 255, 0, 27, 255, 0, 29, 255, 0,
-    79, 253, 0, 83,
-    253, 10, 102, 2, 233, 2, 234, 2, 235, 2, 236, 2, 0, 21, 2, 0, 25, 2, 0,
-    27, 2, 0, 29, 2,
-    49, 68, 250, 72, 249, 80, 250, 82, 250, 85, 242, 86, 249, 87, 244, 88,
-    247, 90, 239,
-    118, 252, 119, 250, 120, 252, 122, 252, 200, 250, 211, 250, 212, 250, 213,
-    250,
-    214, 250, 215, 250, 217, 250, 218, 249, 219, 249, 220, 249, 221, 249, 222,
-    239,
-    250, 252, 251, 252, 252, 252, 253, 252, 254, 252, 0, 1, 252, 0, 8, 250, 0,
-    14, 250,
-    0, 32, 249, 0, 36, 249, 0, 78, 250, 0, 82, 250, 0, 100, 242, 0, 102, 242,
-    0, 108, 249,
-    0, 109, 252, 0, 112, 249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116,
-    249, 0, 117,
-    252, 0, 122, 239, 49, 68, 250, 72, 249, 80, 250, 82, 250, 85, 242, 86,
-    249, 87, 244,
-    88, 247, 90, 239, 118, 252, 119, 250, 120, 252, 122, 252, 200, 250, 211,
-    250, 212,
-    250, 213, 250, 214, 250, 215, 250, 217, 250, 218, 249, 219, 249, 220, 249,
-    221,
-    249, 222, 239, 250, 252, 251, 252, 252, 252, 253, 252, 254, 252, 0, 1,
-    252, 0, 8,
-    250, 0, 14, 250, 0, 32, 249, 0, 36, 249, 0, 78, 250, 0, 82, 250, 0, 100,
-    242, 0, 102,
-    242, 0, 108, 249, 0, 109, 252, 0, 112, 249, 0, 113, 252, 0, 114, 249, 0,
-    115, 252,
-    0, 116, 249, 0, 117, 252, 0, 122, 239, 49, 68, 250, 72, 249, 80, 250, 82,
-    250, 85,
-    242, 86, 249, 87, 244, 88, 247, 90, 239, 118, 252, 119, 250, 120, 252,
-    122, 252,
-    200, 250, 211, 250, 212, 250, 213, 250, 214, 250, 215, 250, 217, 250, 218,
-    249,
-    219, 249, 220, 249, 221, 249, 222, 239, 250, 252, 251, 252, 252, 252, 253,
-    252,
-    254, 252, 0, 1, 252, 0, 8, 250, 0, 14, 250, 0, 32, 249, 0, 36, 249, 0, 78,
-    250, 0, 82,
-    250, 0, 100, 242, 0, 102, 242, 0, 108, 249, 0, 109, 252, 0, 112, 249, 0,
-    113, 252,
-    0, 114, 249, 0, 115, 252, 0, 116, 249, 0, 117, 252, 0, 122, 239, 49, 68,
-    250, 72, 249,
-    80, 250, 82, 250, 85, 242, 86, 249, 87, 244, 88, 247, 90, 239, 118, 252,
-    119, 250,
-    120, 252, 122, 252, 200, 250, 211, 250, 212, 250, 213, 250, 214, 250, 215,
-    250,
-    217, 250, 218, 249, 219, 249, 220, 249, 221, 249, 222, 239, 250, 252, 251,
-    252,
-    252, 252, 253, 252, 254, 252, 0, 1, 252, 0, 8, 250, 0, 14, 250, 0, 32,
-    249, 0, 36, 249,
-    0, 78, 250, 0, 82, 250, 0, 100, 242, 0, 102, 242, 0, 108, 249, 0, 109,
-    252, 0, 112,
-    249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116, 249, 0, 117, 252, 0,
-    122, 239,
-    49, 68, 250, 72, 249, 80, 250, 82, 250, 85, 242, 86, 249, 87, 244, 88,
-    247, 90, 239,
-    118, 252, 119, 250, 120, 252, 122, 252, 200, 250, 211, 250, 212, 250, 213,
-    250,
-    214, 250, 215, 250, 217, 250, 218, 249, 219, 249, 220, 249, 221, 249, 222,
-    239,
-    250, 252, 251, 252, 252, 252, 253, 252, 254, 252, 0, 1, 252, 0, 8, 250, 0,
-    14, 250,
-    0, 32, 249, 0, 36, 249, 0, 78, 250, 0, 82, 250, 0, 100, 242, 0, 102, 242,
-    0, 108, 249,
-    0, 109, 252, 0, 112, 249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116,
-    249, 0, 117,
-    252, 0, 122, 239, 49, 68, 250, 72, 249, 80, 250, 82, 250, 85, 242, 86,
-    249, 87, 244,
-    88, 247, 90, 239, 118, 252, 119, 250, 120, 252, 122, 252, 200, 250, 211,
-    250, 212,
-    250, 213, 250, 214, 250, 215, 250, 217, 250, 218, 249, 219, 249, 220, 249,
-    221,
-    249, 222, 239, 250, 252, 251, 252, 252, 252, 253, 252, 254, 252, 0, 1,
-    252, 0, 8,
-    250, 0, 14, 250, 0, 32, 249, 0, 36, 249, 0, 78, 250, 0, 82, 250, 0, 100,
-    242, 0, 102,
-    242, 0, 108, 249, 0, 109, 252, 0, 112, 249, 0, 113, 252, 0, 114, 249, 0,
-    115, 252,
-    0, 116, 249, 0, 117, 252, 0, 122, 239, 22, 45, 250, 47, 250, 66, 249, 85,
-    250, 87,
-    249, 88, 249, 89, 249, 90, 245, 193, 249, 194, 249, 195, 249, 196, 249,
-    197, 249,
-    198, 249, 222, 245, 0, 2, 249, 0, 4, 249, 0, 6, 249, 0, 100, 250, 0, 102,
-    250, 0, 122,
-    245, 22, 45, 250, 47, 250, 66, 249, 85, 250, 87, 249, 88, 249, 89, 249,
-    90, 245, 193,
-    249, 194, 249, 195, 249, 196, 249, 197, 249, 198, 249, 222, 245, 0, 2,
-    249, 0, 4,
-    249, 0, 6, 249, 0, 100, 250, 0, 102, 250, 0, 122, 245, 22, 45, 250, 47,
-    250, 66, 249,
-    85, 250, 87, 249, 88, 249, 89, 249, 90, 245, 193, 249, 194, 249, 195, 249,
-    196, 249,
-    197, 249, 198, 249, 222, 245, 0, 2, 249, 0, 4, 249, 0, 6, 249, 0, 100,
-    250, 0, 102,
-    250, 0, 122, 245, 22, 45, 250, 47, 250, 66, 249, 85, 250, 87, 249, 88,
-    249, 89, 249,
-    90, 245, 193, 249, 194, 249, 195, 249, 196, 249, 197, 249, 198, 249, 222,
-    245, 0,
-    2, 249, 0, 4, 249, 0, 6, 249, 0, 100, 250, 0, 102, 250, 0, 122, 245, 22,
-    45, 250, 47,
-    250, 66, 249, 85, 250, 87, 249, 88, 249, 89, 249, 90, 245, 193, 249, 194,
-    249, 195,
-    249, 196, 249, 197, 249, 198, 249, 222, 245, 0, 2, 249, 0, 4, 249, 0, 6,
-    249, 0, 100,
-    250, 0, 102, 250, 0, 122, 245, 22, 45, 250, 47, 250, 66, 249, 85, 250, 87,
-    249, 88,
-    249, 89, 249, 90, 245, 193, 249, 194, 249, 195, 249, 196, 249, 197, 249,
-    198, 249,
-    222, 245, 0, 2, 249, 0, 4, 249, 0, 6, 249, 0, 100, 250, 0, 102, 250, 0,
-    122, 245, 13,
-    45, 252, 47, 252, 66, 249, 193, 249, 194, 249, 195, 249, 196, 249, 197,
-    249, 198,
-    249, 0, 2, 249, 0, 4, 249, 0, 6, 249, 13, 45, 252, 47, 252, 66, 249, 193,
-    249, 194,
-    249, 195, 249, 196, 249, 197, 249, 198, 249, 0, 2, 249, 0, 4, 249, 0, 6,
-    249, 13, 45,
-    252, 47, 252, 66, 249, 193, 249, 194, 249, 195, 249, 196, 249, 197, 249,
-    198, 249,
-    0, 2, 249, 0, 4, 249, 0, 6, 249, 13, 45, 252, 47, 252, 66, 249, 193, 249,
-    194, 249,
-    195, 249, 196, 249, 197, 249, 198, 249, 0, 2, 249, 0, 4, 249, 0, 6, 249,
-    61, 45, 240,
-    47, 240, 59, 249, 60, 249, 66, 239, 80, 245, 98, 242, 102, 244, 112, 240,
-    118, 240,
-    193, 239, 194, 239, 195, 239, 196, 239, 197, 239, 198, 239, 211, 245, 212,
-    245,
-    213, 245, 214, 245, 215, 245, 217, 245, 225, 242, 226, 242, 227, 242, 228,
-    242,
-    229, 242, 230, 242, 233, 244, 234, 244, 235, 244, 236, 244, 243, 240, 244,
-    240,
-    245, 240, 246, 240, 247, 240, 249, 240, 250, 240, 251, 240, 252, 240, 253,
-    240,
-    0, 2, 239, 0, 3, 242, 0, 4, 239, 0, 5, 242, 0, 6, 239, 0, 7, 242, 0, 21,
-    244, 0, 25, 244,
-    0, 27, 244, 0, 29, 244, 0, 78, 245, 0, 79, 240, 0, 82, 245, 0, 83, 240, 0,
-    109, 240,
-    0, 113, 240, 0, 115, 240, 0, 117, 240, 9, 104, 255, 119, 254, 120, 254,
-    122, 254,
-    254, 254, 0, 1, 254, 0, 33, 255, 0, 37, 255, 9, 104, 255, 119, 254, 120,
-    254, 122,
-    254, 254, 254, 0, 1, 254, 0, 33, 255, 0, 37, 255, 9, 104, 255, 119, 254,
-    120, 254,
-    122, 254, 254, 254, 0, 1, 254, 0, 33, 255, 0, 37, 255, 9, 104, 255, 119,
-    254, 120,
-    254, 122, 254, 254, 254, 0, 1, 254, 0, 33, 255, 0, 37, 255, 9, 104, 255,
-    119, 254,
-    120, 254, 122, 254, 254, 254, 0, 1, 254, 0, 33, 255, 0, 37, 255, 9, 104,
-    255, 119,
-    254, 120, 254, 122, 254, 254, 254, 0, 1, 254, 0, 33, 255, 0, 37, 255, 11,
-    105, 255,
-    108, 254, 109, 254, 122, 255, 254, 255, 0, 1, 255, 0, 57, 254, 0, 60, 254,
-    0, 62, 254,
-    0, 68, 254, 9, 45, 2, 47, 3, 119, 254, 120, 254, 121, 254, 122, 254, 254,
-    254, 0, 1,
-    254, 9, 45, 2, 47, 3, 119, 254, 120, 254, 121, 254, 122, 254, 254, 254, 0,
-    1, 254,
-    9, 45, 2, 47, 3, 119, 254, 120, 254, 121, 254, 122, 254, 254, 254, 0, 1,
-    254, 9, 45,
-    2, 47, 3, 119, 254, 120, 254, 121, 254, 122, 254, 254, 254, 0, 1, 254, 14,
-    118, 255,
-    119, 250, 122, 254, 250, 255, 251, 255, 252, 255, 253, 255, 254, 254, 0,
-    1, 254,
-    0, 109, 255, 0, 113, 255, 0, 115, 255, 0, 117, 255, 7, 119, 254, 120, 254,
-    121, 252,
-    122, 254, 254, 254, 0, 1, 254, 7, 119, 254, 120, 254, 121, 252, 122, 254,
-    254, 254,
-    0, 1, 254, 7, 119, 254, 120, 254, 121, 252, 122, 254, 254, 254, 0, 1, 254,
-    7, 119,
-    254, 120, 254, 121, 252, 122, 254, 254, 254, 0, 1, 254, 7, 119, 254, 120,
-    254, 121,
-    252, 122, 254, 254, 254, 0, 1, 254, 7, 119, 254, 120, 254, 121, 252, 122,
-    254, 254,
-    254, 0, 1, 254, 31, 45, 244, 47, 244, 98, 252, 102, 255, 112, 253, 225,
-    252, 226,
-    252, 227, 252, 228, 252, 229, 252, 230, 252, 233, 255, 234, 255, 235, 255,
-    236,
-    255, 243, 253, 244, 253, 245, 253, 246, 253, 247, 253, 249, 253, 0, 3,
-    252, 0, 5,
-    252, 0, 7, 252, 0, 21, 255, 0, 25, 255, 0, 27, 255, 0, 29, 255, 0, 79,
-    253, 0, 83, 253,
-    31, 45, 244, 47, 244, 98, 252, 102, 255, 112, 253, 225, 252, 226, 252,
-    227, 252,
-    228, 252, 229, 252, 230, 252, 233, 255, 234, 255, 235, 255, 236, 255, 243,
-    253,
-    244, 253, 245, 253, 246, 253, 247, 253, 249, 253, 0, 3, 252, 0, 5, 252, 0,
-    7, 252,
-    0, 21, 255, 0, 25, 255, 0, 27, 255, 0, 29, 255, 0, 79, 253, 0, 83, 253,
-    49, 68, 250,
-    72, 249, 80, 250, 82, 250, 85, 242, 86, 249, 87, 244, 88, 247, 90, 239,
-    118, 252,
-    119, 250, 120, 252, 122, 252, 200, 250, 211, 250, 212, 250, 213, 250, 214,
-    250,
-    215, 250, 217, 250, 218, 249, 219, 249, 220, 249, 221, 249, 222, 239, 250,
-    252,
-    251, 252, 252, 252, 253, 252, 254, 252, 0, 1, 252, 0, 8, 250, 0, 14, 250,
-    0, 32, 249,
-    0, 36, 249, 0, 78, 250, 0, 82, 250, 0, 100, 242, 0, 102, 242, 0, 108, 249,
-    0, 109, 252,
-    0, 112, 249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116, 249, 0, 117,
-    252, 0, 122,
-    239, 9, 104, 255, 119, 254, 120, 254, 122, 254, 254, 254, 0, 1, 254, 0,
-    33, 255, 0,
-    37, 255, 49, 68, 250, 72, 249, 80, 250, 82, 250, 85, 242, 86, 249, 87,
-    244, 88, 247,
-    90, 239, 118, 252, 119, 250, 120, 252, 122, 252, 200, 250, 211, 250, 212,
-    250, 213,
-    250, 214, 250, 215, 250, 217, 250, 218, 249, 219, 249, 220, 249, 221, 249,
-    222,
-    239, 250, 252, 251, 252, 252, 252, 253, 252, 254, 252, 0, 1, 252, 0, 8,
-    250, 0, 14,
-    250, 0, 32, 249, 0, 36, 249, 0, 78, 250, 0, 82, 250, 0, 100, 242, 0, 102,
-    242, 0, 108,
-    249, 0, 109, 252, 0, 112, 249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0,
-    116, 249,
-    0, 117, 252, 0, 122, 239, 9, 104, 255, 119, 254, 120, 254, 122, 254, 254,
-    254, 0,
-    1, 254, 0, 33, 255, 0, 37, 255, 49, 68, 250, 72, 249, 80, 250, 82, 250,
-    85, 242, 86,
-    249, 87, 244, 88, 247, 90, 239, 118, 252, 119, 250, 120, 252, 122, 252,
-    200, 250,
-    211, 250, 212, 250, 213, 250, 214, 250, 215, 250, 217, 250, 218, 249, 219,
-    249,
-    220, 249, 221, 249, 222, 239, 250, 252, 251, 252, 252, 252, 253, 252, 254,
-    252,
-    0, 1, 252, 0, 8, 250, 0, 14, 250, 0, 32, 249, 0, 36, 249, 0, 78, 250, 0,
-    82, 250, 0, 100,
-    242, 0, 102, 242, 0, 108, 249, 0, 109, 252, 0, 112, 249, 0, 113, 252, 0,
-    114, 249,
-    0, 115, 252, 0, 116, 249, 0, 117, 252, 0, 122, 239, 9, 104, 255, 119, 254,
-    120, 254,
-    122, 254, 254, 254, 0, 1, 254, 0, 33, 255, 0, 37, 255, 11, 105, 255, 108,
-    254, 109,
-    254, 122, 255, 254, 255, 0, 1, 255, 0, 57, 254, 0, 60, 254, 0, 62, 254, 0,
-    68, 254,
-    11, 105, 255, 108, 254, 109, 254, 122, 255, 254, 255, 0, 1, 255, 0, 57,
-    254, 0, 60,
-    254, 0, 62, 254, 0, 68, 254, 18, 45, 252, 47, 252, 66, 250, 87, 250, 88,
-    250, 90, 245,
-    193, 250, 194, 250, 195, 250, 196, 250, 197, 250, 198, 250, 222, 245, 0,
-    2, 250,
-    0, 4, 250, 0, 6, 250, 0, 122, 245, 18, 45, 252, 47, 252, 66, 250, 87, 250,
-    88, 250,
-    90, 245, 193, 250, 194, 250, 195, 250, 196, 250, 197, 250, 198, 250, 222,
-    245, 0,
-    2, 250, 0, 4, 250, 0, 6, 250, 0, 122, 245, 8, 101, 255, 119, 254, 120,
-    254, 122, 254,
-    254, 254, 0, 1, 254, 0, 19, 255, 9, 45, 2, 47, 3, 119, 254, 120, 254, 121,
-    254, 122,
-    254, 254, 254, 0, 1, 254, 9, 45, 2, 47, 3, 119, 254, 120, 254, 121, 254,
-    122, 254,
-    254, 254, 0, 1, 254, 9, 45, 2, 47, 3, 119, 254, 120, 254, 121, 254, 122,
-    254, 254,
-    254, 0, 1, 254, 9, 45, 2, 47, 3, 119, 254, 120, 254, 121, 254, 122, 254,
-    254, 254,
-    0, 1, 254, 13, 102, 2, 104, 255, 233, 2, 234, 2, 235, 2, 236, 2, 0, 21, 2,
-    0, 25, 2, 0,
-    27, 2, 0, 29, 2, 0, 33, 255, 0, 37, 255, 13, 102, 2, 104, 255, 233, 2,
-    234, 2, 235, 2,
-    236, 2, 0, 21, 2, 0, 25, 2, 0, 27, 2, 0, 29, 2, 0, 33, 255, 0, 37, 255,
-    40, 80, 252, 102,
-    254, 112, 251, 118, 252, 122, 250, 211, 252, 212, 252, 213, 252, 214, 252,
-    215,
-    252, 217, 252, 233, 254, 234, 254, 235, 254, 236, 254, 243, 251, 244, 251,
-    245,
-    251, 246, 251, 247, 251, 249, 251, 250, 252, 251, 252, 252, 252, 253, 252,
-    254,
-    250, 0, 1, 250, 0, 21, 254, 0, 25, 254, 0, 27, 254, 0, 29, 254, 0, 78,
-    252, 0, 79, 251,
-    0, 82, 252, 0, 83, 251, 0, 109, 252, 0, 113, 252, 0, 115, 252, 0, 117,
-    252, 10, 112,
-    254, 243, 254, 244, 254, 245, 254, 246, 254, 247, 254, 249, 254, 0, 79,
-    254, 0, 83,
-    254, 14, 85, 242, 87, 239, 88, 244, 90, 237, 122, 252, 222, 237, 254, 252,
-    0, 1, 252,
-    0, 100, 242, 0, 102, 242, 0, 122, 237, 1, 32, 25, 234, 1, 32, 29, 234, 5,
-    120, 254,
-    122, 254, 254, 254, 0, 1, 254, 14, 85, 242, 87, 239, 88, 244, 90, 237,
-    122, 252, 222,
-    237, 254, 252, 0, 1, 252, 0, 100, 242, 0, 102, 242, 0, 122, 237, 1, 32,
-    25, 234, 1,
-    32, 29, 234, 5, 120, 254, 122, 254, 254, 254, 0, 1, 254, 14, 85, 242, 87,
-    239, 88,
-    244, 90, 237, 122, 252, 222, 237, 254, 252, 0, 1, 252, 0, 100, 242, 0,
-    102, 242, 0,
-    122, 237, 1, 32, 25, 234, 1, 32, 29, 234, 5, 120, 254, 122, 254, 254, 254,
-    0, 1, 254,
-    14, 118, 255, 119, 250, 122, 254, 250, 255, 251, 255, 252, 255, 253, 255,
-    254, 254,
-    0, 1, 254, 0, 109, 255, 0, 113, 255, 0, 115, 255, 0, 117, 255, 14, 118,
-    255, 119, 250,
-    122, 254, 250, 255, 251, 255, 252, 255, 253, 255, 254, 254, 0, 1, 254, 0,
-    109, 255,
-    0, 113, 255, 0, 115, 255, 0, 117, 255, 14, 118, 255, 119, 250, 122, 254,
-    250, 255,
-    251, 255, 252, 255, 253, 255, 254, 254, 0, 1, 254, 0, 109, 255, 0, 113,
-    255, 0, 115,
-    255, 0, 117, 255, 22, 45, 250, 47, 250, 66, 249, 85, 250, 87, 249, 88,
-    249, 89, 249,
-    90, 245, 193, 249, 194, 249, 195, 249, 196, 249, 197, 249, 198, 249, 222,
-    245, 0,
-    2, 249, 0, 4, 249, 0, 6, 249, 0, 100, 250, 0, 102, 250, 0, 122, 245, 7,
-    119, 254, 120,
-    254, 121, 252, 122, 254, 254, 254, 0, 1, 254, 22, 45, 250, 47, 250, 66,
-    249, 85, 250,
-    87, 249, 88, 249, 89, 249, 90, 245, 193, 249, 194, 249, 195, 249, 196,
-    249, 197,
-    249, 198, 249, 222, 245, 0, 2, 249, 0, 4, 249, 0, 6, 249, 0, 100, 250, 0,
-    102, 250,
-    0, 122, 245, 7, 119, 254, 120, 254, 121, 252, 122, 254, 254, 254, 0, 1,
-    254, 27, 80,
-    254, 85, 254, 86, 254, 87, 249, 88, 250, 90, 249, 211, 254, 212, 254, 213,
-    254, 214,
-    254, 215, 254, 217, 254, 218, 254, 219, 254, 220, 254, 221, 254, 222, 249,
-    0, 78,
-    254, 0, 82, 254, 0, 100, 254, 0, 102, 254, 0, 108, 254, 0, 112, 254, 0,
-    114, 254, 0,
-    116, 254, 0, 122, 249, 34, 45, 247, 46, 254, 47, 247, 100, 254, 101, 254,
-    104, 254,
-    112, 254, 114, 254, 116, 254, 117, 3, 119, 2, 122, 2, 232, 254, 243, 254,
-    244, 254,
-    245, 254, 246, 254, 247, 254, 249, 254, 254, 2, 0, 1, 2, 0, 9, 254, 0, 15,
-    254, 0, 19,
-    254, 0, 33, 254, 0, 37, 254, 0, 79, 254, 0, 83, 254, 0, 93, 254, 0, 97,
-    254, 0, 99, 254,
-    0, 101, 3, 1, 2, 25, 254, 27, 80, 254, 85, 254, 86, 254, 87, 249, 88, 250,
-    90, 249,
-    211, 254, 212, 254, 213, 254, 214, 254, 215, 254, 217, 254, 218, 254, 219,
-    254,
-    220, 254, 221, 254, 222, 249, 0, 78, 254, 0, 82, 254, 0, 100, 254, 0, 102,
-    254, 0,
-    108, 254, 0, 112, 254, 0, 114, 254, 0, 116, 254, 0, 122, 249, 34, 45, 247,
-    46, 254,
-    47, 247, 100, 254, 101, 254, 104, 254, 112, 254, 114, 254, 116, 254, 117,
-    3, 119,
-    2, 122, 2, 232, 254, 243, 254, 244, 254, 245, 254, 246, 254, 247, 254,
-    249, 254,
-    254, 2, 0, 1, 2, 0, 9, 254, 0, 15, 254, 0, 19, 254, 0, 33, 254, 0, 37,
-    254, 0, 79, 254,
-    0, 83, 254, 0, 93, 254, 0, 97, 254, 0, 99, 254, 0, 101, 3, 1, 2, 25, 254,
-    27, 80, 254,
-    85, 254, 86, 254, 87, 249, 88, 250, 90, 249, 211, 254, 212, 254, 213, 254,
-    214, 254,
-    215, 254, 217, 254, 218, 254, 219, 254, 220, 254, 221, 254, 222, 249, 0,
-    78, 254,
-    0, 82, 254, 0, 100, 254, 0, 102, 254, 0, 108, 254, 0, 112, 254, 0, 114,
-    254, 0, 116,
-    254, 0, 122, 249, 34, 45, 247, 46, 254, 47, 247, 100, 254, 101, 254, 104,
-    254, 112,
-    254, 114, 254, 116, 254, 117, 3, 119, 2, 122, 2, 232, 254, 243, 254, 244,
-    254, 245,
-    254, 246, 254, 247, 254, 249, 254, 254, 2, 0, 1, 2, 0, 9, 254, 0, 15, 254,
-    0, 19, 254,
-    0, 33, 254, 0, 37, 254, 0, 79, 254, 0, 83, 254, 0, 93, 254, 0, 97, 254, 0,
-    99, 254, 0,
-    101, 3, 1, 2, 25, 254, 2, 120, 254, 2, 120, 254, 2, 120, 254, 69, 45, 244,
-    46, 237,
-    47, 244, 59, 250, 60, 250, 66, 242, 80, 250, 98, 244, 102, 247, 112, 244,
-    115, 244,
-    118, 242, 120, 247, 122, 247, 193, 242, 194, 242, 195, 242, 196, 242, 197,
-    242,
-    198, 242, 211, 250, 212, 250, 213, 250, 214, 250, 215, 250, 217, 250, 225,
-    244,
-    226, 244, 227, 244, 228, 244, 229, 244, 230, 244, 233, 247, 234, 247, 235,
-    247,
-    236, 247, 243, 244, 244, 244, 245, 244, 246, 244, 247, 244, 249, 244, 250,
-    242,
-    251, 242, 252, 242, 253, 242, 254, 247, 0, 1, 247, 0, 2, 242, 0, 3, 244,
-    0, 4, 242,
-    0, 5, 244, 0, 6, 242, 0, 7, 244, 0, 21, 247, 0, 25, 247, 0, 27, 247, 0,
-    29, 247, 0, 78,
-    250, 0, 79, 244, 0, 82, 250, 0, 83, 244, 0, 87, 244, 0, 89, 244, 0, 109,
-    242, 0, 113,
-    242, 0, 115, 242, 0, 117, 242, 69, 45, 244, 46, 237, 47, 244, 59, 250, 60,
-    250, 66,
-    242, 80, 250, 98, 244, 102, 247, 112, 244, 115, 244, 118, 242, 120, 247,
-    122, 247,
-    193, 242, 194, 242, 195, 242, 196, 242, 197, 242, 198, 242, 211, 250, 212,
-    250,
-    213, 250, 214, 250, 215, 250, 217, 250, 225, 244, 226, 244, 227, 244, 228,
-    244,
-    229, 244, 230, 244, 233, 247, 234, 247, 235, 247, 236, 247, 243, 244, 244,
-    244,
-    245, 244, 246, 244, 247, 244, 249, 244, 250, 242, 251, 242, 252, 242, 253,
-    242,
-    254, 247, 0, 1, 247, 0, 2, 242, 0, 3, 244, 0, 4, 242, 0, 5, 244, 0, 6,
-    242, 0, 7, 244,
-    0, 21, 247, 0, 25, 247, 0, 27, 247, 0, 29, 247, 0, 78, 250, 0, 79, 244, 0,
-    82, 250, 0,
-    83, 244, 0, 87, 244, 0, 89, 244, 0, 109, 242, 0, 113, 242, 0, 115, 242, 0,
-    117, 242,
-    13, 45, 252, 47, 252, 66, 249, 193, 249, 194, 249, 195, 249, 196, 249,
-    197, 249,
-    198, 249, 0, 2, 249, 0, 4, 249, 0, 6, 249, 13, 45, 252, 47, 252, 66, 249,
-    193, 249,
-    194, 249, 195, 249, 196, 249, 197, 249, 198, 249, 0, 2, 249, 0, 4, 249, 0,
-    6, 249,
-    13, 45, 252, 47, 252, 66, 249, 193, 249, 194, 249, 195, 249, 196, 249,
-    197, 249,
-    198, 249, 0, 2, 249, 0, 4, 249, 0, 6, 249, 13, 45, 252, 47, 252, 66, 249,
-    193, 249,
-    194, 249, 195, 249, 196, 249, 197, 249, 198, 249, 0, 2, 249, 0, 4, 249, 0,
-    6, 249,
-    61, 45, 240, 47, 240, 59, 249, 60, 249, 66, 239, 80, 245, 98, 242, 102,
-    244, 112,
-    240, 118, 240, 193, 239, 194, 239, 195, 239, 196, 239, 197, 239, 198, 239,
-    211,
-    245, 212, 245, 213, 245, 214, 245, 215, 245, 217, 245, 225, 242, 226, 242,
-    227,
-    242, 228, 242, 229, 242, 230, 242, 233, 244, 234, 244, 235, 244, 236, 244,
-    243,
-    240, 244, 240, 245, 240, 246, 240, 247, 240, 249, 240, 250, 240, 251, 240,
-    252,
-    240, 253, 240, 0, 2, 239, 0, 3, 242, 0, 4, 239, 0, 5, 242, 0, 6, 239, 0,
-    7, 242, 0, 21,
-    244, 0, 25, 244, 0, 27, 244, 0, 29, 244, 0, 78, 245, 0, 79, 240, 0, 82,
-    245, 0, 83, 240,
-    0, 109, 240, 0, 113, 240, 0, 115, 240, 0, 117, 240, 10, 102, 2, 233, 2,
-    234, 2, 235,
-    2, 236, 2, 0, 21, 2, 0, 25, 2, 0, 27, 2, 0, 29, 2, 10, 102, 2, 233, 2,
-    234, 2, 235, 2, 236,
-    2, 0, 21, 2, 0, 25, 2, 0, 27, 2, 0, 29, 2, 10, 102, 2, 233, 2, 234, 2,
-    235, 2, 236, 2, 0,
-    21, 2, 0, 25, 2, 0, 27, 2, 0, 29, 2, 2, 120, 254, 2, 1, 32, 24, 249, 19,
-    33, 244, 101,
-    244, 109, 254, 115, 250, 116, 247, 119, 254, 0, 19, 244, 0, 60, 254, 0,
-    62, 254, 0,
-    68, 254, 0, 87, 250, 0, 89, 250, 0, 91, 250, 0, 93, 247, 0, 97, 247, 0,
-    99, 247, 1, 2,
-    25, 247, 1, 32, 25, 249, 2, 33, 244
-};
-static afm_cuint16 afm_Helvetica_Bold_highchars_index[] = { /* 220 */
-    161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176,
-    177,
-    178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192,
-    193,
-    194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208,
-    209,
-    210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224,
-    225,
-    226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240,
-    241,
-    242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256,
-    257,
-    258, 259, 260, 261, 262, 263, 268, 269, 270, 271, 272, 273, 274, 275, 278,
-    279,
-    280, 281, 282, 283, 286, 287, 290, 291, 298, 299, 302, 303, 304, 305, 310,
-    311,
-    313, 314, 315, 316, 317, 318, 321, 322, 323, 324, 325, 326, 327, 328, 332,
-    333,
-    336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 350, 351, 352,
-    353,
-    354, 355, 356, 357, 362, 363, 366, 367, 368, 369, 370, 371, 376, 377, 378,
-    379,
-    380, 381, 382, 402, 536, 537, 710, 711, 728, 729, 730, 731, 732, 733,
-    8211, 8212,
-    8216, 8217, 8218, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8249,
-    8250,
-    8260, 8364, 8482, 8706, 8710, 8721, 8722, 8730, 8800, 8804, 8805, 9674,
-    63171,
-    64257, 64258
-};
-static afm_cunicode afm_Helvetica_Bold_ligatures[] = {  /* 3 */
-    102, 105, 64257
-};
-
-
-/* ------------------------------------------------------------------*/
-/* FontName: Helvetica-BoldOblique */
-/* FullName: Helvetica Bold Oblique */
-/* FamilyName: Helvetica */
-static afm_cuint8 afm_Helvetica_BoldOblique_widths[] = {    /* 315 */
-    46, 56, 79, 93, 93, 148, 120, 40, 56, 56, 65, 97, 46, 56, 46, 46, 93, 93,
-    93, 93, 93,
-    93, 93, 93, 93, 93, 56, 56, 97, 97, 97, 102, 163, 120, 120, 120, 120, 111,
-    102, 130,
-    120, 46, 93, 120, 102, 139, 120, 130, 111, 130, 120, 111, 102, 120, 111,
-    157, 111,
-    111, 102, 56, 46, 56, 97, 93, 56, 93, 102, 93, 102, 93, 56, 102, 102, 46,
-    46, 93, 46,
-    148, 102, 102, 102, 102, 65, 93, 56, 102, 93, 130, 93, 93, 83, 65, 47, 65,
-    97, 56,
-    93, 93, 93, 93, 47, 93, 56, 123, 62, 93, 97, 123, 56, 67, 97, 56, 56, 56,
-    102, 93, 46,
-    56, 56, 61, 93, 139, 139, 139, 102, 120, 120, 120, 120, 120, 120, 167,
-    120, 111,
-    111, 111, 111, 46, 46, 46, 46, 120, 120, 130, 130, 130, 130, 130, 97, 130,
-    120, 120,
-    120, 120, 111, 111, 102, 93, 93, 93, 93, 93, 93, 148, 93, 93, 93, 93, 93,
-    46, 46, 46,
-    46, 102, 102, 102, 102, 102, 102, 102, 97, 102, 102, 102, 102, 102, 93,
-    102, 93,
-    120, 93, 120, 93, 120, 93, 120, 93, 120, 93, 120, 124, 120, 102, 111, 93,
-    111, 93,
-    111, 93, 111, 93, 130, 102, 130, 102, 46, 46, 46, 46, 46, 46, 120, 93,
-    102, 46, 102,
-    46, 102, 67, 102, 46, 120, 102, 120, 102, 120, 102, 130, 102, 130, 102,
-    167, 157,
-    120, 65, 120, 65, 120, 65, 111, 93, 111, 93, 111, 93, 102, 56, 102, 65,
-    120, 102,
-    120, 102, 120, 102, 120, 102, 111, 102, 83, 102, 83, 102, 83, 93, 111, 93,
-    56, 56,
-    56, 56, 56, 56, 56, 56, 93, 167, 46, 46, 46, 83, 83, 83, 93, 93, 58, 167,
-    167, 56, 56,
-    28, 93, 167, 82, 102, 100, 97, 92, 92, 92, 92, 82, 42, 102, 102
-};
-static afm_sint16 afm_Helvetica_BoldOblique_kerning_index[] = { /* 315 */
-    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 51, 54, 0, 0,
-    0, 0, 0, 57, 172, 0, 218, 0, 257, 0, 0, 0, 308, 358, 450, 0, 0, 485, 534,
-    627, 654, 0,
-    716, 874, 902, 1051, 0, 1199, 0, 0, 0, 0, 0, 0, 0, 1338, 1358, 1401, 1427,
-    1444, 1462,
-    1517, 1548, 0, 0, 1556, 1577, 1587, 1617, 1649, 1663, 0, 1671, 1752, 0, 0,
-    1755,
-    1803, 1828, 1851, 1921, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1944, 2059, 2174, 2289, 2404, 2519, 0,
-    0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 2634, 2683, 2732, 2781, 2830, 0, 2879, 2928, 2956,
-    2984, 3012,
-    3040, 0, 0, 3179, 3199, 3219, 3239, 3259, 3279, 0, 3299, 3325, 3343, 3361,
-    3379,
-    0, 0, 0, 0, 0, 3397, 3429, 3443, 3457, 3471, 3485, 0, 3499, 0, 0, 0, 0,
-    3513, 0, 3583,
-    3653, 3768, 3788, 3903, 3923, 4038, 0, 4058, 0, 4084, 4110, 0, 4149, 4188,
-    0, 4205,
-    0, 4223, 0, 4241, 0, 4259, 0, 4277, 0, 4308, 0, 0, 0, 0, 0, 0, 4339, 4431,
-    4452, 4487,
-    4497, 4532, 0, 0, 4542, 4577, 0, 4587, 0, 4619, 0, 4651, 4683, 4732, 4746,
-    4795,
-    0, 0, 4809, 4871, 4952, 5014, 5095, 5157, 0, 5238, 0, 5241, 0, 5244, 5247,
-    0, 5405,
-    0, 5563, 0, 5591, 0, 5619, 0, 5647, 0, 5675, 0, 5814, 0, 5837, 0, 5860, 0,
-    0, 5883,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5886, 5891, 0, 0, 5942, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0
-};
-static afm_cuint8 afm_Helvetica_BoldOblique_kerning_data[] = {  /* 5945 */
-    42, 11, 85, 240, 87, 244, 88, 244, 90, 237, 222, 237, 0, 100, 240, 0, 102,
-    240, 0,
-    122, 237, 1, 32, 24, 247, 1, 32, 28, 244, 4, 33, 250, 1, 32, 25, 237, 1,
-    32, 29, 237,
-    4, 33, 250, 1, 32, 25, 237, 1, 32, 29, 237, 2, 33, 250, 2, 33, 250, 49,
-    68, 250, 72,
-    249, 80, 250, 82, 250, 85, 242, 86, 249, 87, 244, 88, 247, 90, 239, 118,
-    252, 119,
-    250, 120, 252, 122, 252, 200, 250, 211, 250, 212, 250, 213, 250, 214, 250,
-    215,
-    250, 217, 250, 218, 249, 219, 249, 220, 249, 221, 249, 222, 239, 250, 252,
-    251,
-    252, 252, 252, 253, 252, 254, 252, 0, 1, 252, 0, 8, 250, 0, 14, 250, 0,
-    32, 249, 0,
-    36, 249, 0, 78, 250, 0, 82, 250, 0, 100, 242, 0, 102, 242, 0, 108, 249, 0,
-    109, 252,
-    0, 112, 249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116, 249, 0, 117,
-    252, 0, 122,
-    239, 20, 66, 252, 86, 255, 193, 252, 194, 252, 195, 252, 196, 252, 197,
-    252, 198,
-    252, 218, 255, 219, 255, 220, 255, 221, 255, 0, 2, 252, 0, 4, 252, 0, 6,
-    252, 0, 108,
-    255, 0, 112, 255, 0, 114, 255, 0, 116, 255, 18, 45, 252, 47, 252, 66, 250,
-    87, 250,
-    88, 250, 90, 245, 193, 250, 194, 250, 195, 250, 196, 250, 197, 250, 198,
-    250, 222,
-    245, 0, 2, 250, 0, 4, 250, 0, 6, 250, 0, 122, 245, 23, 45, 240, 47, 240,
-    66, 244, 98,
-    254, 193, 244, 194, 244, 195, 244, 196, 244, 197, 244, 198, 244, 225, 254,
-    226,
-    254, 227, 254, 228, 254, 229, 254, 230, 254, 0, 2, 244, 0, 3, 254, 0, 4,
-    244, 0, 5,
-    254, 0, 6, 244, 0, 7, 254, 22, 45, 254, 47, 254, 66, 254, 118, 254, 193,
-    254, 194,
-    254, 195, 254, 196, 254, 197, 254, 198, 254, 250, 254, 251, 254, 252, 254,
-    253,
-    254, 0, 2, 254, 0, 4, 254, 0, 6, 254, 0, 109, 254, 0, 113, 254, 0, 115,
-    254, 0, 117,
-    254, 40, 80, 252, 102, 254, 112, 251, 118, 252, 122, 250, 211, 252, 212,
-    252, 213,
-    252, 214, 252, 215, 252, 217, 252, 233, 254, 234, 254, 235, 254, 236, 254,
-    243,
-    251, 244, 251, 245, 251, 246, 251, 247, 251, 249, 251, 250, 252, 251, 252,
-    252,
-    252, 253, 252, 254, 250, 0, 1, 250, 0, 21, 254, 0, 25, 254, 0, 27, 254, 0,
-    29, 254,
-    0, 78, 252, 0, 79, 251, 0, 82, 252, 0, 83, 251, 0, 109, 252, 0, 113, 252,
-    0, 115, 252,
-    0, 117, 252, 14, 85, 242, 87, 239, 88, 244, 90, 237, 122, 252, 222, 237,
-    254, 252,
-    0, 1, 252, 0, 100, 242, 0, 102, 242, 0, 122, 237, 1, 32, 25, 234, 1, 32,
-    29, 234, 22,
-    45, 250, 47, 250, 66, 249, 85, 250, 87, 249, 88, 249, 89, 249, 90, 245,
-    193, 249,
-    194, 249, 195, 249, 196, 249, 197, 249, 198, 249, 222, 245, 0, 2, 249, 0,
-    4, 249,
-    0, 6, 249, 0, 100, 250, 0, 102, 250, 0, 122, 245, 41, 45, 237, 47, 237,
-    66, 240, 98,
-    252, 102, 252, 112, 250, 193, 240, 194, 240, 195, 240, 196, 240, 197, 240,
-    198,
-    240, 225, 252, 226, 252, 227, 252, 228, 252, 229, 252, 230, 252, 233, 252,
-    234,
-    252, 235, 252, 236, 252, 243, 250, 244, 250, 245, 250, 246, 250, 247, 250,
-    249,
-    250, 0, 2, 240, 0, 3, 252, 0, 4, 240, 0, 5, 252, 0, 6, 240, 0, 7, 252, 0,
-    21, 252, 0, 25,
-    252, 0, 27, 252, 0, 29, 252, 0, 79, 250, 0, 83, 250, 12, 45, 3, 47, 3, 86,
-    255, 218,
-    255, 219, 255, 220, 255, 221, 255, 0, 108, 255, 0, 112, 255, 0, 114, 255,
-    0, 116,
-    255, 27, 80, 254, 85, 254, 86, 254, 87, 249, 88, 250, 90, 249, 211, 254,
-    212, 254,
-    213, 254, 214, 254, 215, 254, 217, 254, 218, 254, 219, 254, 220, 254, 221,
-    254,
-    222, 249, 0, 78, 254, 0, 82, 254, 0, 100, 254, 0, 102, 254, 0, 108, 254,
-    0, 112, 254,
-    0, 114, 254, 0, 116, 254, 0, 122, 249, 69, 45, 244, 46, 237, 47, 244, 59,
-    250, 60,
-    250, 66, 242, 80, 250, 98, 244, 102, 247, 112, 244, 115, 244, 118, 242,
-    120, 247,
-    122, 247, 193, 242, 194, 242, 195, 242, 196, 242, 197, 242, 198, 242, 211,
-    250,
-    212, 250, 213, 250, 214, 250, 215, 250, 217, 250, 225, 244, 226, 244, 227,
-    244,
-    228, 244, 229, 244, 230, 244, 233, 247, 234, 247, 235, 247, 236, 247, 243,
-    244,
-    244, 244, 245, 244, 246, 244, 247, 244, 249, 244, 250, 242, 251, 242, 252,
-    242,
-    253, 242, 254, 247, 0, 1, 247, 0, 2, 242, 0, 3, 244, 0, 4, 242, 0, 5, 244,
-    0, 6, 242,
-    0, 7, 244, 0, 21, 247, 0, 25, 247, 0, 27, 247, 0, 29, 247, 0, 78, 250, 0,
-    79, 244, 0,
-    82, 250, 0, 83, 244, 0, 87, 244, 0, 89, 244, 0, 109, 242, 0, 113, 242, 0,
-    115, 242,
-    0, 117, 242, 13, 45, 252, 47, 252, 66, 249, 193, 249, 194, 249, 195, 249,
-    196, 249,
-    197, 249, 198, 249, 0, 2, 249, 0, 4, 249, 0, 6, 249, 65, 45, 237, 46, 244,
-    47, 237,
-    59, 250, 60, 250, 66, 244, 72, 249, 80, 249, 98, 247, 102, 249, 112, 242,
-    118, 247,
-    193, 244, 194, 244, 195, 244, 196, 244, 197, 244, 198, 244, 211, 249, 212,
-    249,
-    213, 249, 214, 249, 215, 249, 217, 249, 225, 247, 226, 247, 227, 247, 228,
-    247,
-    229, 247, 230, 247, 233, 249, 234, 249, 235, 249, 236, 249, 243, 242, 244,
-    242,
-    245, 242, 246, 242, 247, 242, 249, 242, 250, 247, 251, 247, 252, 247, 253,
-    247,
-    0, 2, 244, 0, 3, 247, 0, 4, 244, 0, 5, 247, 0, 6, 244, 0, 7, 247, 0, 21,
-    249, 0, 25, 249,
-    0, 27, 249, 0, 29, 249, 0, 32, 249, 0, 36, 249, 0, 78, 249, 0, 79, 242, 0,
-    82, 249, 0,
-    83, 242, 0, 109, 247, 0, 113, 247, 0, 115, 247, 0, 117, 247, 65, 45, 244,
-    46, 250,
-    47, 244, 59, 255, 60, 255, 66, 247, 80, 254, 98, 250, 102, 251, 112, 247,
-    118, 249,
-    122, 254, 193, 247, 194, 247, 195, 247, 196, 247, 197, 247, 198, 247, 211,
-    254,
-    212, 254, 213, 254, 214, 254, 215, 254, 217, 254, 225, 250, 226, 250, 227,
-    250,
-    228, 250, 229, 250, 230, 250, 233, 251, 234, 251, 235, 251, 236, 251, 243,
-    247,
-    244, 247, 245, 247, 246, 247, 247, 247, 249, 247, 250, 249, 251, 249, 252,
-    249,
-    253, 249, 254, 254, 0, 1, 254, 0, 2, 247, 0, 3, 250, 0, 4, 247, 0, 5, 250,
-    0, 6, 247,
-    0, 7, 250, 0, 21, 251, 0, 25, 251, 0, 27, 251, 0, 29, 251, 0, 78, 254, 0,
-    79, 247, 0,
-    82, 254, 0, 83, 247, 0, 109, 249, 0, 113, 249, 0, 115, 249, 0, 117, 249,
-    61, 45, 240,
-    47, 240, 59, 249, 60, 249, 66, 239, 80, 245, 98, 242, 102, 244, 112, 240,
-    118, 240,
-    193, 239, 194, 239, 195, 239, 196, 239, 197, 239, 198, 239, 211, 245, 212,
-    245,
-    213, 245, 214, 245, 215, 245, 217, 245, 225, 242, 226, 242, 227, 242, 228,
-    242,
-    229, 242, 230, 242, 233, 244, 234, 244, 235, 244, 236, 244, 243, 240, 244,
-    240,
-    245, 240, 246, 240, 247, 240, 249, 240, 250, 240, 251, 240, 252, 240, 253,
-    240,
-    0, 2, 239, 0, 3, 242, 0, 4, 239, 0, 5, 242, 0, 6, 239, 0, 7, 242, 0, 21,
-    244, 0, 25, 244,
-    0, 27, 244, 0, 29, 244, 0, 78, 245, 0, 79, 240, 0, 82, 245, 0, 83, 240, 0,
-    109, 240,
-    0, 113, 240, 0, 115, 240, 0, 117, 240, 9, 104, 255, 119, 254, 120, 254,
-    122, 254,
-    254, 254, 0, 1, 254, 0, 33, 255, 0, 37, 255, 18, 109, 255, 118, 254, 119,
-    254, 122,
-    254, 250, 254, 251, 254, 252, 254, 253, 254, 254, 254, 0, 1, 254, 0, 60,
-    255, 0, 62,
-    255, 0, 68, 255, 0, 109, 254, 0, 113, 254, 0, 115, 254, 0, 117, 254, 11,
-    105, 255,
-    108, 254, 109, 254, 122, 255, 254, 255, 0, 1, 255, 0, 57, 254, 0, 60, 254,
-    0, 62, 254,
-    0, 68, 254, 8, 101, 255, 119, 254, 120, 254, 122, 254, 254, 254, 0, 1,
-    254, 0, 19,
-    255, 9, 45, 2, 47, 3, 119, 254, 120, 254, 121, 254, 122, 254, 254, 254, 0,
-    1, 254,
-    23, 45, 255, 47, 255, 102, 255, 112, 254, 233, 255, 234, 255, 235, 255,
-    236, 255,
-    243, 254, 244, 254, 245, 254, 246, 254, 247, 254, 249, 254, 0, 21, 255, 0,
-    25, 255,
-    0, 27, 255, 0, 29, 255, 0, 79, 254, 0, 83, 254, 1, 32, 25, 5, 1, 32, 29,
-    5, 13, 102, 2,
-    104, 255, 233, 2, 234, 2, 235, 2, 236, 2, 0, 21, 2, 0, 25, 2, 0, 27, 2, 0,
-    29, 2, 0, 33,
-    255, 0, 37, 255, 4, 122, 254, 254, 254, 0, 1, 254, 10, 112, 254, 243, 254,
-    244, 254,
-    245, 254, 246, 254, 247, 254, 249, 254, 0, 79, 254, 0, 83, 254, 5, 120,
-    254, 122,
-    254, 254, 254, 0, 1, 254, 13, 118, 254, 122, 252, 250, 254, 251, 254, 252,
-    254, 253,
-    254, 254, 252, 0, 1, 252, 0, 109, 254, 0, 113, 254, 0, 115, 254, 0, 117,
-    254, 14, 118,
-    255, 119, 250, 122, 254, 250, 255, 251, 255, 252, 255, 253, 255, 254, 254,
-    0, 1,
-    254, 0, 109, 255, 0, 113, 255, 0, 115, 255, 0, 117, 255, 7, 119, 254, 120,
-    254, 121,
-    252, 122, 254, 254, 254, 0, 1, 254, 4, 122, 254, 254, 254, 0, 1, 254, 34,
-    45, 247,
-    46, 254, 47, 247, 100, 254, 101, 254, 104, 254, 112, 254, 114, 254, 116,
-    254, 117,
-    3, 119, 2, 122, 2, 232, 254, 243, 254, 244, 254, 245, 254, 246, 254, 247,
-    254, 249,
-    254, 254, 2, 0, 1, 2, 0, 9, 254, 0, 15, 254, 0, 19, 254, 0, 33, 254, 0,
-    37, 254, 0, 79,
-    254, 0, 83, 254, 0, 93, 254, 0, 97, 254, 0, 99, 254, 0, 101, 3, 1, 2, 25,
-    254, 2, 120,
-    254, 22, 45, 244, 47, 244, 98, 254, 112, 252, 225, 254, 226, 254, 227,
-    254, 228,
-    254, 229, 254, 230, 254, 243, 252, 244, 252, 245, 252, 246, 252, 247, 252,
-    249,
-    252, 0, 3, 254, 0, 5, 254, 0, 7, 254, 0, 79, 252, 0, 83, 252, 12, 45, 250,
-    47, 250, 112,
-    254, 243, 254, 244, 254, 245, 254, 246, 254, 247, 254, 249, 254, 0, 79,
-    254, 0, 83,
-    254, 10, 102, 255, 233, 255, 234, 255, 235, 255, 236, 255, 0, 21, 255, 0,
-    25, 255,
-    0, 27, 255, 0, 29, 255, 31, 45, 244, 47, 244, 98, 252, 102, 255, 112, 253,
-    225, 252,
-    226, 252, 227, 252, 228, 252, 229, 252, 230, 252, 233, 255, 234, 255, 235,
-    255,
-    236, 255, 243, 253, 244, 253, 245, 253, 246, 253, 247, 253, 249, 253, 0,
-    3, 252,
-    0, 5, 252, 0, 7, 252, 0, 21, 255, 0, 25, 255, 0, 27, 255, 0, 29, 255, 0,
-    79, 253, 0, 83,
-    253, 10, 102, 2, 233, 2, 234, 2, 235, 2, 236, 2, 0, 21, 2, 0, 25, 2, 0,
-    27, 2, 0, 29, 2,
-    49, 68, 250, 72, 249, 80, 250, 82, 250, 85, 242, 86, 249, 87, 244, 88,
-    247, 90, 239,
-    118, 252, 119, 250, 120, 252, 122, 252, 200, 250, 211, 250, 212, 250, 213,
-    250,
-    214, 250, 215, 250, 217, 250, 218, 249, 219, 249, 220, 249, 221, 249, 222,
-    239,
-    250, 252, 251, 252, 252, 252, 253, 252, 254, 252, 0, 1, 252, 0, 8, 250, 0,
-    14, 250,
-    0, 32, 249, 0, 36, 249, 0, 78, 250, 0, 82, 250, 0, 100, 242, 0, 102, 242,
-    0, 108, 249,
-    0, 109, 252, 0, 112, 249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116,
-    249, 0, 117,
-    252, 0, 122, 239, 49, 68, 250, 72, 249, 80, 250, 82, 250, 85, 242, 86,
-    249, 87, 244,
-    88, 247, 90, 239, 118, 252, 119, 250, 120, 252, 122, 252, 200, 250, 211,
-    250, 212,
-    250, 213, 250, 214, 250, 215, 250, 217, 250, 218, 249, 219, 249, 220, 249,
-    221,
-    249, 222, 239, 250, 252, 251, 252, 252, 252, 253, 252, 254, 252, 0, 1,
-    252, 0, 8,
-    250, 0, 14, 250, 0, 32, 249, 0, 36, 249, 0, 78, 250, 0, 82, 250, 0, 100,
-    242, 0, 102,
-    242, 0, 108, 249, 0, 109, 252, 0, 112, 249, 0, 113, 252, 0, 114, 249, 0,
-    115, 252,
-    0, 116, 249, 0, 117, 252, 0, 122, 239, 49, 68, 250, 72, 249, 80, 250, 82,
-    250, 85,
-    242, 86, 249, 87, 244, 88, 247, 90, 239, 118, 252, 119, 250, 120, 252,
-    122, 252,
-    200, 250, 211, 250, 212, 250, 213, 250, 214, 250, 215, 250, 217, 250, 218,
-    249,
-    219, 249, 220, 249, 221, 249, 222, 239, 250, 252, 251, 252, 252, 252, 253,
-    252,
-    254, 252, 0, 1, 252, 0, 8, 250, 0, 14, 250, 0, 32, 249, 0, 36, 249, 0, 78,
-    250, 0, 82,
-    250, 0, 100, 242, 0, 102, 242, 0, 108, 249, 0, 109, 252, 0, 112, 249, 0,
-    113, 252,
-    0, 114, 249, 0, 115, 252, 0, 116, 249, 0, 117, 252, 0, 122, 239, 49, 68,
-    250, 72, 249,
-    80, 250, 82, 250, 85, 242, 86, 249, 87, 244, 88, 247, 90, 239, 118, 252,
-    119, 250,
-    120, 252, 122, 252, 200, 250, 211, 250, 212, 250, 213, 250, 214, 250, 215,
-    250,
-    217, 250, 218, 249, 219, 249, 220, 249, 221, 249, 222, 239, 250, 252, 251,
-    252,
-    252, 252, 253, 252, 254, 252, 0, 1, 252, 0, 8, 250, 0, 14, 250, 0, 32,
-    249, 0, 36, 249,
-    0, 78, 250, 0, 82, 250, 0, 100, 242, 0, 102, 242, 0, 108, 249, 0, 109,
-    252, 0, 112,
-    249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116, 249, 0, 117, 252, 0,
-    122, 239,
-    49, 68, 250, 72, 249, 80, 250, 82, 250, 85, 242, 86, 249, 87, 244, 88,
-    247, 90, 239,
-    118, 252, 119, 250, 120, 252, 122, 252, 200, 250, 211, 250, 212, 250, 213,
-    250,
-    214, 250, 215, 250, 217, 250, 218, 249, 219, 249, 220, 249, 221, 249, 222,
-    239,
-    250, 252, 251, 252, 252, 252, 253, 252, 254, 252, 0, 1, 252, 0, 8, 250, 0,
-    14, 250,
-    0, 32, 249, 0, 36, 249, 0, 78, 250, 0, 82, 250, 0, 100, 242, 0, 102, 242,
-    0, 108, 249,
-    0, 109, 252, 0, 112, 249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116,
-    249, 0, 117,
-    252, 0, 122, 239, 49, 68, 250, 72, 249, 80, 250, 82, 250, 85, 242, 86,
-    249, 87, 244,
-    88, 247, 90, 239, 118, 252, 119, 250, 120, 252, 122, 252, 200, 250, 211,
-    250, 212,
-    250, 213, 250, 214, 250, 215, 250, 217, 250, 218, 249, 219, 249, 220, 249,
-    221,
-    249, 222, 239, 250, 252, 251, 252, 252, 252, 253, 252, 254, 252, 0, 1,
-    252, 0, 8,
-    250, 0, 14, 250, 0, 32, 249, 0, 36, 249, 0, 78, 250, 0, 82, 250, 0, 100,
-    242, 0, 102,
-    242, 0, 108, 249, 0, 109, 252, 0, 112, 249, 0, 113, 252, 0, 114, 249, 0,
-    115, 252,
-    0, 116, 249, 0, 117, 252, 0, 122, 239, 22, 45, 250, 47, 250, 66, 249, 85,
-    250, 87,
-    249, 88, 249, 89, 249, 90, 245, 193, 249, 194, 249, 195, 249, 196, 249,
-    197, 249,
-    198, 249, 222, 245, 0, 2, 249, 0, 4, 249, 0, 6, 249, 0, 100, 250, 0, 102,
-    250, 0, 122,
-    245, 22, 45, 250, 47, 250, 66, 249, 85, 250, 87, 249, 88, 249, 89, 249,
-    90, 245, 193,
-    249, 194, 249, 195, 249, 196, 249, 197, 249, 198, 249, 222, 245, 0, 2,
-    249, 0, 4,
-    249, 0, 6, 249, 0, 100, 250, 0, 102, 250, 0, 122, 245, 22, 45, 250, 47,
-    250, 66, 249,
-    85, 250, 87, 249, 88, 249, 89, 249, 90, 245, 193, 249, 194, 249, 195, 249,
-    196, 249,
-    197, 249, 198, 249, 222, 245, 0, 2, 249, 0, 4, 249, 0, 6, 249, 0, 100,
-    250, 0, 102,
-    250, 0, 122, 245, 22, 45, 250, 47, 250, 66, 249, 85, 250, 87, 249, 88,
-    249, 89, 249,
-    90, 245, 193, 249, 194, 249, 195, 249, 196, 249, 197, 249, 198, 249, 222,
-    245, 0,
-    2, 249, 0, 4, 249, 0, 6, 249, 0, 100, 250, 0, 102, 250, 0, 122, 245, 22,
-    45, 250, 47,
-    250, 66, 249, 85, 250, 87, 249, 88, 249, 89, 249, 90, 245, 193, 249, 194,
-    249, 195,
-    249, 196, 249, 197, 249, 198, 249, 222, 245, 0, 2, 249, 0, 4, 249, 0, 6,
-    249, 0, 100,
-    250, 0, 102, 250, 0, 122, 245, 22, 45, 250, 47, 250, 66, 249, 85, 250, 87,
-    249, 88,
-    249, 89, 249, 90, 245, 193, 249, 194, 249, 195, 249, 196, 249, 197, 249,
-    198, 249,
-    222, 245, 0, 2, 249, 0, 4, 249, 0, 6, 249, 0, 100, 250, 0, 102, 250, 0,
-    122, 245, 13,
-    45, 252, 47, 252, 66, 249, 193, 249, 194, 249, 195, 249, 196, 249, 197,
-    249, 198,
-    249, 0, 2, 249, 0, 4, 249, 0, 6, 249, 13, 45, 252, 47, 252, 66, 249, 193,
-    249, 194,
-    249, 195, 249, 196, 249, 197, 249, 198, 249, 0, 2, 249, 0, 4, 249, 0, 6,
-    249, 13, 45,
-    252, 47, 252, 66, 249, 193, 249, 194, 249, 195, 249, 196, 249, 197, 249,
-    198, 249,
-    0, 2, 249, 0, 4, 249, 0, 6, 249, 13, 45, 252, 47, 252, 66, 249, 193, 249,
-    194, 249,
-    195, 249, 196, 249, 197, 249, 198, 249, 0, 2, 249, 0, 4, 249, 0, 6, 249,
-    61, 45, 240,
-    47, 240, 59, 249, 60, 249, 66, 239, 80, 245, 98, 242, 102, 244, 112, 240,
-    118, 240,
-    193, 239, 194, 239, 195, 239, 196, 239, 197, 239, 198, 239, 211, 245, 212,
-    245,
-    213, 245, 214, 245, 215, 245, 217, 245, 225, 242, 226, 242, 227, 242, 228,
-    242,
-    229, 242, 230, 242, 233, 244, 234, 244, 235, 244, 236, 244, 243, 240, 244,
-    240,
-    245, 240, 246, 240, 247, 240, 249, 240, 250, 240, 251, 240, 252, 240, 253,
-    240,
-    0, 2, 239, 0, 3, 242, 0, 4, 239, 0, 5, 242, 0, 6, 239, 0, 7, 242, 0, 21,
-    244, 0, 25, 244,
-    0, 27, 244, 0, 29, 244, 0, 78, 245, 0, 79, 240, 0, 82, 245, 0, 83, 240, 0,
-    109, 240,
-    0, 113, 240, 0, 115, 240, 0, 117, 240, 9, 104, 255, 119, 254, 120, 254,
-    122, 254,
-    254, 254, 0, 1, 254, 0, 33, 255, 0, 37, 255, 9, 104, 255, 119, 254, 120,
-    254, 122,
-    254, 254, 254, 0, 1, 254, 0, 33, 255, 0, 37, 255, 9, 104, 255, 119, 254,
-    120, 254,
-    122, 254, 254, 254, 0, 1, 254, 0, 33, 255, 0, 37, 255, 9, 104, 255, 119,
-    254, 120,
-    254, 122, 254, 254, 254, 0, 1, 254, 0, 33, 255, 0, 37, 255, 9, 104, 255,
-    119, 254,
-    120, 254, 122, 254, 254, 254, 0, 1, 254, 0, 33, 255, 0, 37, 255, 9, 104,
-    255, 119,
-    254, 120, 254, 122, 254, 254, 254, 0, 1, 254, 0, 33, 255, 0, 37, 255, 11,
-    105, 255,
-    108, 254, 109, 254, 122, 255, 254, 255, 0, 1, 255, 0, 57, 254, 0, 60, 254,
-    0, 62, 254,
-    0, 68, 254, 9, 45, 2, 47, 3, 119, 254, 120, 254, 121, 254, 122, 254, 254,
-    254, 0, 1,
-    254, 9, 45, 2, 47, 3, 119, 254, 120, 254, 121, 254, 122, 254, 254, 254, 0,
-    1, 254,
-    9, 45, 2, 47, 3, 119, 254, 120, 254, 121, 254, 122, 254, 254, 254, 0, 1,
-    254, 9, 45,
-    2, 47, 3, 119, 254, 120, 254, 121, 254, 122, 254, 254, 254, 0, 1, 254, 14,
-    118, 255,
-    119, 250, 122, 254, 250, 255, 251, 255, 252, 255, 253, 255, 254, 254, 0,
-    1, 254,
-    0, 109, 255, 0, 113, 255, 0, 115, 255, 0, 117, 255, 7, 119, 254, 120, 254,
-    121, 252,
-    122, 254, 254, 254, 0, 1, 254, 7, 119, 254, 120, 254, 121, 252, 122, 254,
-    254, 254,
-    0, 1, 254, 7, 119, 254, 120, 254, 121, 252, 122, 254, 254, 254, 0, 1, 254,
-    7, 119,
-    254, 120, 254, 121, 252, 122, 254, 254, 254, 0, 1, 254, 7, 119, 254, 120,
-    254, 121,
-    252, 122, 254, 254, 254, 0, 1, 254, 7, 119, 254, 120, 254, 121, 252, 122,
-    254, 254,
-    254, 0, 1, 254, 31, 45, 244, 47, 244, 98, 252, 102, 255, 112, 253, 225,
-    252, 226,
-    252, 227, 252, 228, 252, 229, 252, 230, 252, 233, 255, 234, 255, 235, 255,
-    236,
-    255, 243, 253, 244, 253, 245, 253, 246, 253, 247, 253, 249, 253, 0, 3,
-    252, 0, 5,
-    252, 0, 7, 252, 0, 21, 255, 0, 25, 255, 0, 27, 255, 0, 29, 255, 0, 79,
-    253, 0, 83, 253,
-    31, 45, 244, 47, 244, 98, 252, 102, 255, 112, 253, 225, 252, 226, 252,
-    227, 252,
-    228, 252, 229, 252, 230, 252, 233, 255, 234, 255, 235, 255, 236, 255, 243,
-    253,
-    244, 253, 245, 253, 246, 253, 247, 253, 249, 253, 0, 3, 252, 0, 5, 252, 0,
-    7, 252,
-    0, 21, 255, 0, 25, 255, 0, 27, 255, 0, 29, 255, 0, 79, 253, 0, 83, 253,
-    49, 68, 250,
-    72, 249, 80, 250, 82, 250, 85, 242, 86, 249, 87, 244, 88, 247, 90, 239,
-    118, 252,
-    119, 250, 120, 252, 122, 252, 200, 250, 211, 250, 212, 250, 213, 250, 214,
-    250,
-    215, 250, 217, 250, 218, 249, 219, 249, 220, 249, 221, 249, 222, 239, 250,
-    252,
-    251, 252, 252, 252, 253, 252, 254, 252, 0, 1, 252, 0, 8, 250, 0, 14, 250,
-    0, 32, 249,
-    0, 36, 249, 0, 78, 250, 0, 82, 250, 0, 100, 242, 0, 102, 242, 0, 108, 249,
-    0, 109, 252,
-    0, 112, 249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116, 249, 0, 117,
-    252, 0, 122,
-    239, 9, 104, 255, 119, 254, 120, 254, 122, 254, 254, 254, 0, 1, 254, 0,
-    33, 255, 0,
-    37, 255, 49, 68, 250, 72, 249, 80, 250, 82, 250, 85, 242, 86, 249, 87,
-    244, 88, 247,
-    90, 239, 118, 252, 119, 250, 120, 252, 122, 252, 200, 250, 211, 250, 212,
-    250, 213,
-    250, 214, 250, 215, 250, 217, 250, 218, 249, 219, 249, 220, 249, 221, 249,
-    222,
-    239, 250, 252, 251, 252, 252, 252, 253, 252, 254, 252, 0, 1, 252, 0, 8,
-    250, 0, 14,
-    250, 0, 32, 249, 0, 36, 249, 0, 78, 250, 0, 82, 250, 0, 100, 242, 0, 102,
-    242, 0, 108,
-    249, 0, 109, 252, 0, 112, 249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0,
-    116, 249,
-    0, 117, 252, 0, 122, 239, 9, 104, 255, 119, 254, 120, 254, 122, 254, 254,
-    254, 0,
-    1, 254, 0, 33, 255, 0, 37, 255, 49, 68, 250, 72, 249, 80, 250, 82, 250,
-    85, 242, 86,
-    249, 87, 244, 88, 247, 90, 239, 118, 252, 119, 250, 120, 252, 122, 252,
-    200, 250,
-    211, 250, 212, 250, 213, 250, 214, 250, 215, 250, 217, 250, 218, 249, 219,
-    249,
-    220, 249, 221, 249, 222, 239, 250, 252, 251, 252, 252, 252, 253, 252, 254,
-    252,
-    0, 1, 252, 0, 8, 250, 0, 14, 250, 0, 32, 249, 0, 36, 249, 0, 78, 250, 0,
-    82, 250, 0, 100,
-    242, 0, 102, 242, 0, 108, 249, 0, 109, 252, 0, 112, 249, 0, 113, 252, 0,
-    114, 249,
-    0, 115, 252, 0, 116, 249, 0, 117, 252, 0, 122, 239, 9, 104, 255, 119, 254,
-    120, 254,
-    122, 254, 254, 254, 0, 1, 254, 0, 33, 255, 0, 37, 255, 11, 105, 255, 108,
-    254, 109,
-    254, 122, 255, 254, 255, 0, 1, 255, 0, 57, 254, 0, 60, 254, 0, 62, 254, 0,
-    68, 254,
-    11, 105, 255, 108, 254, 109, 254, 122, 255, 254, 255, 0, 1, 255, 0, 57,
-    254, 0, 60,
-    254, 0, 62, 254, 0, 68, 254, 18, 45, 252, 47, 252, 66, 250, 87, 250, 88,
-    250, 90, 245,
-    193, 250, 194, 250, 195, 250, 196, 250, 197, 250, 198, 250, 222, 245, 0,
-    2, 250,
-    0, 4, 250, 0, 6, 250, 0, 122, 245, 18, 45, 252, 47, 252, 66, 250, 87, 250,
-    88, 250,
-    90, 245, 193, 250, 194, 250, 195, 250, 196, 250, 197, 250, 198, 250, 222,
-    245, 0,
-    2, 250, 0, 4, 250, 0, 6, 250, 0, 122, 245, 8, 101, 255, 119, 254, 120,
-    254, 122, 254,
-    254, 254, 0, 1, 254, 0, 19, 255, 9, 45, 2, 47, 3, 119, 254, 120, 254, 121,
-    254, 122,
-    254, 254, 254, 0, 1, 254, 9, 45, 2, 47, 3, 119, 254, 120, 254, 121, 254,
-    122, 254,
-    254, 254, 0, 1, 254, 9, 45, 2, 47, 3, 119, 254, 120, 254, 121, 254, 122,
-    254, 254,
-    254, 0, 1, 254, 9, 45, 2, 47, 3, 119, 254, 120, 254, 121, 254, 122, 254,
-    254, 254,
-    0, 1, 254, 13, 102, 2, 104, 255, 233, 2, 234, 2, 235, 2, 236, 2, 0, 21, 2,
-    0, 25, 2, 0,
-    27, 2, 0, 29, 2, 0, 33, 255, 0, 37, 255, 13, 102, 2, 104, 255, 233, 2,
-    234, 2, 235, 2,
-    236, 2, 0, 21, 2, 0, 25, 2, 0, 27, 2, 0, 29, 2, 0, 33, 255, 0, 37, 255,
-    40, 80, 252, 102,
-    254, 112, 251, 118, 252, 122, 250, 211, 252, 212, 252, 213, 252, 214, 252,
-    215,
-    252, 217, 252, 233, 254, 234, 254, 235, 254, 236, 254, 243, 251, 244, 251,
-    245,
-    251, 246, 251, 247, 251, 249, 251, 250, 252, 251, 252, 252, 252, 253, 252,
-    254,
-    250, 0, 1, 250, 0, 21, 254, 0, 25, 254, 0, 27, 254, 0, 29, 254, 0, 78,
-    252, 0, 79, 251,
-    0, 82, 252, 0, 83, 251, 0, 109, 252, 0, 113, 252, 0, 115, 252, 0, 117,
-    252, 10, 112,
-    254, 243, 254, 244, 254, 245, 254, 246, 254, 247, 254, 249, 254, 0, 79,
-    254, 0, 83,
-    254, 14, 85, 242, 87, 239, 88, 244, 90, 237, 122, 252, 222, 237, 254, 252,
-    0, 1, 252,
-    0, 100, 242, 0, 102, 242, 0, 122, 237, 1, 32, 25, 234, 1, 32, 29, 234, 5,
-    120, 254,
-    122, 254, 254, 254, 0, 1, 254, 14, 85, 242, 87, 239, 88, 244, 90, 237,
-    122, 252, 222,
-    237, 254, 252, 0, 1, 252, 0, 100, 242, 0, 102, 242, 0, 122, 237, 1, 32,
-    25, 234, 1,
-    32, 29, 234, 5, 120, 254, 122, 254, 254, 254, 0, 1, 254, 14, 85, 242, 87,
-    239, 88,
-    244, 90, 237, 122, 252, 222, 237, 254, 252, 0, 1, 252, 0, 100, 242, 0,
-    102, 242, 0,
-    122, 237, 1, 32, 25, 234, 1, 32, 29, 234, 5, 120, 254, 122, 254, 254, 254,
-    0, 1, 254,
-    14, 118, 255, 119, 250, 122, 254, 250, 255, 251, 255, 252, 255, 253, 255,
-    254, 254,
-    0, 1, 254, 0, 109, 255, 0, 113, 255, 0, 115, 255, 0, 117, 255, 14, 118,
-    255, 119, 250,
-    122, 254, 250, 255, 251, 255, 252, 255, 253, 255, 254, 254, 0, 1, 254, 0,
-    109, 255,
-    0, 113, 255, 0, 115, 255, 0, 117, 255, 14, 118, 255, 119, 250, 122, 254,
-    250, 255,
-    251, 255, 252, 255, 253, 255, 254, 254, 0, 1, 254, 0, 109, 255, 0, 113,
-    255, 0, 115,
-    255, 0, 117, 255, 22, 45, 250, 47, 250, 66, 249, 85, 250, 87, 249, 88,
-    249, 89, 249,
-    90, 245, 193, 249, 194, 249, 195, 249, 196, 249, 197, 249, 198, 249, 222,
-    245, 0,
-    2, 249, 0, 4, 249, 0, 6, 249, 0, 100, 250, 0, 102, 250, 0, 122, 245, 7,
-    119, 254, 120,
-    254, 121, 252, 122, 254, 254, 254, 0, 1, 254, 22, 45, 250, 47, 250, 66,
-    249, 85, 250,
-    87, 249, 88, 249, 89, 249, 90, 245, 193, 249, 194, 249, 195, 249, 196,
-    249, 197,
-    249, 198, 249, 222, 245, 0, 2, 249, 0, 4, 249, 0, 6, 249, 0, 100, 250, 0,
-    102, 250,
-    0, 122, 245, 7, 119, 254, 120, 254, 121, 252, 122, 254, 254, 254, 0, 1,
-    254, 27, 80,
-    254, 85, 254, 86, 254, 87, 249, 88, 250, 90, 249, 211, 254, 212, 254, 213,
-    254, 214,
-    254, 215, 254, 217, 254, 218, 254, 219, 254, 220, 254, 221, 254, 222, 249,
-    0, 78,
-    254, 0, 82, 254, 0, 100, 254, 0, 102, 254, 0, 108, 254, 0, 112, 254, 0,
-    114, 254, 0,
-    116, 254, 0, 122, 249, 34, 45, 247, 46, 254, 47, 247, 100, 254, 101, 254,
-    104, 254,
-    112, 254, 114, 254, 116, 254, 117, 3, 119, 2, 122, 2, 232, 254, 243, 254,
-    244, 254,
-    245, 254, 246, 254, 247, 254, 249, 254, 254, 2, 0, 1, 2, 0, 9, 254, 0, 15,
-    254, 0, 19,
-    254, 0, 33, 254, 0, 37, 254, 0, 79, 254, 0, 83, 254, 0, 93, 254, 0, 97,
-    254, 0, 99, 254,
-    0, 101, 3, 1, 2, 25, 254, 27, 80, 254, 85, 254, 86, 254, 87, 249, 88, 250,
-    90, 249,
-    211, 254, 212, 254, 213, 254, 214, 254, 215, 254, 217, 254, 218, 254, 219,
-    254,
-    220, 254, 221, 254, 222, 249, 0, 78, 254, 0, 82, 254, 0, 100, 254, 0, 102,
-    254, 0,
-    108, 254, 0, 112, 254, 0, 114, 254, 0, 116, 254, 0, 122, 249, 34, 45, 247,
-    46, 254,
-    47, 247, 100, 254, 101, 254, 104, 254, 112, 254, 114, 254, 116, 254, 117,
-    3, 119,
-    2, 122, 2, 232, 254, 243, 254, 244, 254, 245, 254, 246, 254, 247, 254,
-    249, 254,
-    254, 2, 0, 1, 2, 0, 9, 254, 0, 15, 254, 0, 19, 254, 0, 33, 254, 0, 37,
-    254, 0, 79, 254,
-    0, 83, 254, 0, 93, 254, 0, 97, 254, 0, 99, 254, 0, 101, 3, 1, 2, 25, 254,
-    27, 80, 254,
-    85, 254, 86, 254, 87, 249, 88, 250, 90, 249, 211, 254, 212, 254, 213, 254,
-    214, 254,
-    215, 254, 217, 254, 218, 254, 219, 254, 220, 254, 221, 254, 222, 249, 0,
-    78, 254,
-    0, 82, 254, 0, 100, 254, 0, 102, 254, 0, 108, 254, 0, 112, 254, 0, 114,
-    254, 0, 116,
-    254, 0, 122, 249, 34, 45, 247, 46, 254, 47, 247, 100, 254, 101, 254, 104,
-    254, 112,
-    254, 114, 254, 116, 254, 117, 3, 119, 2, 122, 2, 232, 254, 243, 254, 244,
-    254, 245,
-    254, 246, 254, 247, 254, 249, 254, 254, 2, 0, 1, 2, 0, 9, 254, 0, 15, 254,
-    0, 19, 254,
-    0, 33, 254, 0, 37, 254, 0, 79, 254, 0, 83, 254, 0, 93, 254, 0, 97, 254, 0,
-    99, 254, 0,
-    101, 3, 1, 2, 25, 254, 2, 120, 254, 2, 120, 254, 2, 120, 254, 69, 45, 244,
-    46, 237,
-    47, 244, 59, 250, 60, 250, 66, 242, 80, 250, 98, 244, 102, 247, 112, 244,
-    115, 244,
-    118, 242, 120, 247, 122, 247, 193, 242, 194, 242, 195, 242, 196, 242, 197,
-    242,
-    198, 242, 211, 250, 212, 250, 213, 250, 214, 250, 215, 250, 217, 250, 225,
-    244,
-    226, 244, 227, 244, 228, 244, 229, 244, 230, 244, 233, 247, 234, 247, 235,
-    247,
-    236, 247, 243, 244, 244, 244, 245, 244, 246, 244, 247, 244, 249, 244, 250,
-    242,
-    251, 242, 252, 242, 253, 242, 254, 247, 0, 1, 247, 0, 2, 242, 0, 3, 244,
-    0, 4, 242,
-    0, 5, 244, 0, 6, 242, 0, 7, 244, 0, 21, 247, 0, 25, 247, 0, 27, 247, 0,
-    29, 247, 0, 78,
-    250, 0, 79, 244, 0, 82, 250, 0, 83, 244, 0, 87, 244, 0, 89, 244, 0, 109,
-    242, 0, 113,
-    242, 0, 115, 242, 0, 117, 242, 69, 45, 244, 46, 237, 47, 244, 59, 250, 60,
-    250, 66,
-    242, 80, 250, 98, 244, 102, 247, 112, 244, 115, 244, 118, 242, 120, 247,
-    122, 247,
-    193, 242, 194, 242, 195, 242, 196, 242, 197, 242, 198, 242, 211, 250, 212,
-    250,
-    213, 250, 214, 250, 215, 250, 217, 250, 225, 244, 226, 244, 227, 244, 228,
-    244,
-    229, 244, 230, 244, 233, 247, 234, 247, 235, 247, 236, 247, 243, 244, 244,
-    244,
-    245, 244, 246, 244, 247, 244, 249, 244, 250, 242, 251, 242, 252, 242, 253,
-    242,
-    254, 247, 0, 1, 247, 0, 2, 242, 0, 3, 244, 0, 4, 242, 0, 5, 244, 0, 6,
-    242, 0, 7, 244,
-    0, 21, 247, 0, 25, 247, 0, 27, 247, 0, 29, 247, 0, 78, 250, 0, 79, 244, 0,
-    82, 250, 0,
-    83, 244, 0, 87, 244, 0, 89, 244, 0, 109, 242, 0, 113, 242, 0, 115, 242, 0,
-    117, 242,
-    13, 45, 252, 47, 252, 66, 249, 193, 249, 194, 249, 195, 249, 196, 249,
-    197, 249,
-    198, 249, 0, 2, 249, 0, 4, 249, 0, 6, 249, 13, 45, 252, 47, 252, 66, 249,
-    193, 249,
-    194, 249, 195, 249, 196, 249, 197, 249, 198, 249, 0, 2, 249, 0, 4, 249, 0,
-    6, 249,
-    13, 45, 252, 47, 252, 66, 249, 193, 249, 194, 249, 195, 249, 196, 249,
-    197, 249,
-    198, 249, 0, 2, 249, 0, 4, 249, 0, 6, 249, 13, 45, 252, 47, 252, 66, 249,
-    193, 249,
-    194, 249, 195, 249, 196, 249, 197, 249, 198, 249, 0, 2, 249, 0, 4, 249, 0,
-    6, 249,
-    61, 45, 240, 47, 240, 59, 249, 60, 249, 66, 239, 80, 245, 98, 242, 102,
-    244, 112,
-    240, 118, 240, 193, 239, 194, 239, 195, 239, 196, 239, 197, 239, 198, 239,
-    211,
-    245, 212, 245, 213, 245, 214, 245, 215, 245, 217, 245, 225, 242, 226, 242,
-    227,
-    242, 228, 242, 229, 242, 230, 242, 233, 244, 234, 244, 235, 244, 236, 244,
-    243,
-    240, 244, 240, 245, 240, 246, 240, 247, 240, 249, 240, 250, 240, 251, 240,
-    252,
-    240, 253, 240, 0, 2, 239, 0, 3, 242, 0, 4, 239, 0, 5, 242, 0, 6, 239, 0,
-    7, 242, 0, 21,
-    244, 0, 25, 244, 0, 27, 244, 0, 29, 244, 0, 78, 245, 0, 79, 240, 0, 82,
-    245, 0, 83, 240,
-    0, 109, 240, 0, 113, 240, 0, 115, 240, 0, 117, 240, 10, 102, 2, 233, 2,
-    234, 2, 235,
-    2, 236, 2, 0, 21, 2, 0, 25, 2, 0, 27, 2, 0, 29, 2, 10, 102, 2, 233, 2,
-    234, 2, 235, 2, 236,
-    2, 0, 21, 2, 0, 25, 2, 0, 27, 2, 0, 29, 2, 10, 102, 2, 233, 2, 234, 2,
-    235, 2, 236, 2, 0,
-    21, 2, 0, 25, 2, 0, 27, 2, 0, 29, 2, 2, 120, 254, 2, 1, 32, 24, 249, 19,
-    33, 244, 101,
-    244, 109, 254, 115, 250, 116, 247, 119, 254, 0, 19, 244, 0, 60, 254, 0,
-    62, 254, 0,
-    68, 254, 0, 87, 250, 0, 89, 250, 0, 91, 250, 0, 93, 247, 0, 97, 247, 0,
-    99, 247, 1, 2,
-    25, 247, 1, 32, 25, 249, 2, 33, 244
-};
-static afm_cuint16 afm_Helvetica_BoldOblique_highchars_index[] = {  /* 220 */
-    161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176,
-    177,
-    178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192,
-    193,
-    194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208,
-    209,
-    210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224,
-    225,
-    226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240,
-    241,
-    242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256,
-    257,
-    258, 259, 260, 261, 262, 263, 268, 269, 270, 271, 272, 273, 274, 275, 278,
-    279,
-    280, 281, 282, 283, 286, 287, 290, 291, 298, 299, 302, 303, 304, 305, 310,
-    311,
-    313, 314, 315, 316, 317, 318, 321, 322, 323, 324, 325, 326, 327, 328, 332,
-    333,
-    336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 350, 351, 352,
-    353,
-    354, 355, 356, 357, 362, 363, 366, 367, 368, 369, 370, 371, 376, 377, 378,
-    379,
-    380, 381, 382, 402, 536, 537, 710, 711, 728, 729, 730, 731, 732, 733,
-    8211, 8212,
-    8216, 8217, 8218, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8249,
-    8250,
-    8260, 8364, 8482, 8706, 8710, 8721, 8722, 8730, 8800, 8804, 8805, 9674,
-    63171,
-    64257, 64258
-};
-static afm_cunicode afm_Helvetica_BoldOblique_ligatures[] = {   /* 3 */
-    102, 105, 64257
-};
-
-
-/* ------------------------------------------------------------------*/
-/* FontName: Helvetica-Oblique */
-/* FullName: Helvetica Oblique */
-/* FamilyName: Helvetica */
-static afm_cuint8 afm_Helvetica_Oblique_widths[] = {    /* 315 */
-    46, 46, 59, 93, 93, 148, 111, 32, 56, 56, 65, 97, 46, 56, 46, 46, 93, 93,
-    93, 93, 93,
-    93, 93, 93, 93, 93, 46, 46, 97, 97, 97, 93, 169, 111, 111, 120, 120, 111,
-    102, 130,
-    120, 46, 83, 111, 93, 139, 120, 130, 111, 130, 120, 111, 102, 120, 111,
-    157, 111,
-    111, 102, 46, 46, 46, 78, 93, 56, 93, 93, 83, 93, 93, 46, 93, 93, 37, 37,
-    83, 37, 139,
-    93, 93, 93, 93, 56, 83, 46, 93, 83, 120, 83, 83, 83, 56, 43, 56, 97, 56,
-    93, 93, 93,
-    93, 43, 93, 56, 123, 62, 93, 97, 123, 56, 67, 97, 56, 56, 56, 93, 90, 46,
-    56, 56, 61,
-    93, 139, 139, 139, 102, 111, 111, 111, 111, 111, 111, 167, 120, 111, 111,
-    111, 111,
-    46, 46, 46, 46, 120, 120, 130, 130, 130, 130, 130, 97, 130, 120, 120, 120,
-    120, 111,
-    111, 102, 93, 93, 93, 93, 93, 93, 148, 83, 93, 93, 93, 93, 46, 46, 46, 46,
-    93, 93, 93,
-    93, 93, 93, 93, 97, 102, 93, 93, 93, 93, 83, 93, 83, 111, 93, 111, 93,
-    111, 93, 120,
-    83, 120, 83, 120, 107, 120, 93, 111, 93, 111, 93, 111, 93, 111, 93, 130,
-    93, 130,
-    93, 46, 46, 46, 37, 46, 46, 111, 83, 93, 37, 93, 37, 93, 50, 93, 37, 120,
-    93, 120, 93,
-    120, 93, 130, 93, 130, 93, 167, 157, 120, 56, 120, 56, 120, 56, 111, 83,
-    111, 83,
-    111, 83, 102, 46, 102, 53, 120, 93, 120, 93, 120, 93, 120, 93, 111, 102,
-    83, 102,
-    83, 102, 83, 93, 111, 83, 56, 56, 56, 56, 56, 56, 56, 56, 93, 167, 37, 37,
-    37, 56, 56,
-    56, 93, 93, 58, 167, 167, 56, 56, 28, 93, 167, 79, 102, 100, 97, 76, 92,
-    92, 92, 79,
-    42, 83, 83
-};
-static afm_sint16 afm_Helvetica_Oblique_kerning_index[] = { /* 315 */
-    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 49, 52, 0, 0,
-    0, 0, 0, 55, 170, 197, 202, 0, 241, 0, 0, 0, 345, 418, 510, 0, 0, 545,
-    594, 687, 710,
-    772, 777, 938, 966, 1115, 0, 1259, 0, 0, 0, 0, 0, 0, 0, 1407, 1419, 1468,
-    0, 1476,
-    1494, 1575, 1587, 0, 0, 1595, 0, 1638, 1668, 1700, 1718, 0, 1730, 1847, 0,
-    0, 1854,
-    1924, 1994, 2017, 2087, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2130, 2245, 2360, 2475, 2590, 2705, 0,
-    2820, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 2825, 2874, 2923, 2972, 3021, 0, 3070, 3119, 3147,
-    3175, 3203,
-    3231, 0, 0, 3379, 3391, 3403, 3415, 3427, 3439, 0, 3451, 3459, 3477, 3495,
-    3513,
-    0, 0, 0, 0, 0, 3531, 3563, 3581, 3599, 3617, 3635, 0, 3653, 0, 0, 0, 0,
-    3882, 0, 3952,
-    4022, 4137, 4149, 4264, 4276, 4391, 4403, 4408, 4416, 4421, 4429, 0, 4468,
-    0,
-    0, 4507, 0, 4525, 0, 4543, 0, 4561, 0, 4579, 0, 4591, 0, 0, 0, 0, 0, 0,
-    4603, 4695,
-    4738, 0, 4773, 0, 4808, 0, 4843, 0, 0, 4878, 0, 4910, 0, 4942, 4974, 5023,
-    5041,
-    5090, 0, 0, 5108, 5170, 5287, 5349, 5466, 5528, 5645, 5650, 5657, 5662,
-    5669,
-    5674, 5681, 0, 5842, 0, 6003, 0, 6031, 0, 6059, 0, 6087, 0, 6115, 0, 6263,
-    0, 6306,
-    0, 6349, 0, 6392, 6397, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6404, 6409, 0, 0,
-    6447, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
-};
-static afm_cuint8 afm_Helvetica_Oblique_kerning_data[] = {  /* 6450 */
-    42, 11, 85, 249, 87, 249, 88, 250, 90, 242, 222, 242, 0, 100, 249, 0, 102,
-    249, 0,
-    122, 242, 1, 32, 24, 247, 1, 32, 28, 252, 3, 1, 32, 25, 240, 1, 32, 29,
-    240, 4, 33, 247,
-    1, 32, 25, 240, 1, 32, 29, 240, 2, 33, 249, 2, 33, 249, 49, 68, 252, 72,
-    252, 80, 252,
-    82, 252, 85, 237, 86, 249, 87, 245, 88, 249, 90, 240, 118, 252, 119, 250,
-    120, 250,
-    122, 250, 200, 252, 211, 252, 212, 252, 213, 252, 214, 252, 215, 252, 217,
-    252,
-    218, 249, 219, 249, 220, 249, 221, 249, 222, 240, 250, 252, 251, 252, 252,
-    252,
-    253, 252, 254, 250, 0, 1, 250, 0, 8, 252, 0, 14, 252, 0, 32, 252, 0, 36,
-    252, 0, 78,
-    252, 0, 82, 252, 0, 100, 237, 0, 102, 237, 0, 108, 249, 0, 109, 252, 0,
-    112, 249, 0,
-    113, 252, 0, 114, 249, 0, 115, 252, 0, 116, 249, 0, 117, 252, 0, 122, 240,
-    12, 45,
-    254, 47, 254, 86, 255, 218, 255, 219, 255, 220, 255, 221, 255, 0, 108,
-    255, 0, 112,
-    255, 0, 114, 255, 0, 116, 255, 3, 45, 252, 47, 252, 18, 45, 245, 47, 245,
-    66, 250,
-    87, 245, 88, 250, 90, 242, 193, 250, 194, 250, 195, 250, 196, 250, 197,
-    250, 198,
-    250, 222, 242, 0, 2, 250, 0, 4, 250, 0, 6, 250, 0, 122, 242, 45, 45, 232,
-    47, 232, 66,
-    244, 98, 249, 102, 252, 112, 252, 115, 249, 193, 244, 194, 244, 195, 244,
-    196, 244,
-    197, 244, 198, 244, 225, 249, 226, 249, 227, 249, 228, 249, 229, 249, 230,
-    249,
-    233, 252, 234, 252, 235, 252, 236, 252, 243, 252, 244, 252, 245, 252, 246,
-    252,
-    247, 252, 249, 252, 0, 2, 244, 0, 3, 249, 0, 4, 244, 0, 5, 249, 0, 6, 244,
-    0, 7, 249,
-    0, 21, 252, 0, 25, 252, 0, 27, 252, 0, 29, 252, 0, 79, 252, 0, 83, 252, 0,
-    87, 249, 0,
-    89, 249, 0, 91, 249, 32, 45, 252, 47, 252, 66, 254, 98, 254, 118, 254,
-    193, 254, 194,
-    254, 195, 254, 196, 254, 197, 254, 198, 254, 225, 254, 226, 254, 227, 254,
-    228,
-    254, 229, 254, 230, 254, 250, 254, 251, 254, 252, 254, 253, 254, 0, 2,
-    254, 0, 3,
-    254, 0, 4, 254, 0, 5, 254, 0, 6, 254, 0, 7, 254, 0, 109, 254, 0, 113, 254,
-    0, 115, 254,
-    0, 117, 254, 40, 80, 249, 102, 250, 112, 250, 118, 252, 122, 249, 211,
-    249, 212,
-    249, 213, 249, 214, 249, 215, 249, 217, 249, 233, 250, 234, 250, 235, 250,
-    236,
-    250, 243, 250, 244, 250, 245, 250, 246, 250, 247, 250, 249, 250, 250, 252,
-    251,
-    252, 252, 252, 253, 252, 254, 249, 0, 1, 249, 0, 21, 250, 0, 25, 250, 0,
-    27, 250, 0,
-    29, 250, 0, 78, 249, 0, 79, 250, 0, 82, 249, 0, 83, 250, 0, 109, 252, 0,
-    113, 252, 0,
-    115, 252, 0, 117, 252, 14, 85, 239, 87, 239, 88, 245, 90, 234, 122, 252,
-    222, 234,
-    254, 252, 0, 1, 252, 0, 100, 239, 0, 102, 239, 0, 122, 234, 1, 32, 25,
-    230, 1, 32, 29,
-    234, 22, 45, 250, 47, 250, 66, 254, 85, 250, 87, 249, 88, 252, 89, 247,
-    90, 245, 193,
-    254, 194, 254, 195, 254, 196, 254, 197, 254, 198, 254, 222, 245, 0, 2,
-    254, 0, 4,
-    254, 0, 6, 254, 0, 100, 250, 0, 102, 250, 0, 122, 245, 41, 45, 227, 47,
-    227, 66, 237,
-    98, 250, 102, 249, 112, 249, 193, 237, 194, 237, 195, 237, 196, 237, 197,
-    237, 198,
-    237, 225, 250, 226, 250, 227, 250, 228, 250, 229, 250, 230, 250, 233, 249,
-    234,
-    249, 235, 249, 236, 249, 243, 249, 244, 249, 245, 249, 246, 249, 247, 249,
-    249,
-    249, 0, 2, 237, 0, 3, 250, 0, 4, 237, 0, 5, 250, 0, 6, 237, 0, 7, 250, 0,
-    21, 249, 0, 25,
-    249, 0, 27, 249, 0, 29, 249, 0, 79, 249, 0, 83, 249, 10, 86, 255, 218,
-    255, 219, 255,
-    220, 255, 221, 255, 0, 108, 255, 0, 112, 255, 0, 114, 255, 0, 116, 255,
-    27, 80, 254,
-    85, 252, 86, 250, 87, 249, 88, 252, 90, 249, 211, 254, 212, 254, 213, 254,
-    214, 254,
-    215, 254, 217, 254, 218, 250, 219, 250, 220, 250, 221, 250, 222, 249, 0,
-    78, 254,
-    0, 82, 254, 0, 100, 252, 0, 102, 252, 0, 108, 250, 0, 112, 250, 0, 114,
-    250, 0, 116,
-    250, 0, 122, 249, 3, 45, 254, 47, 254, 70, 45, 237, 46, 234, 47, 237, 59,
-    254, 60,
-    254, 66, 237, 80, 250, 98, 237, 102, 237, 112, 237, 115, 237, 118, 237,
-    120, 237,
-    122, 237, 193, 237, 194, 237, 195, 237, 196, 237, 197, 237, 198, 237, 211,
-    250,
-    212, 250, 213, 250, 214, 250, 215, 250, 217, 250, 225, 237, 226, 237, 227,
-    237,
-    228, 247, 229, 237, 230, 237, 233, 247, 234, 237, 235, 237, 236, 237, 243,
-    237,
-    244, 237, 245, 237, 246, 247, 247, 237, 249, 237, 250, 237, 251, 237, 252,
-    237,
-    253, 237, 254, 237, 0, 1, 247, 0, 2, 237, 0, 3, 247, 0, 4, 237, 0, 5, 247,
-    0, 6, 237,
-    0, 7, 237, 0, 21, 247, 0, 25, 237, 0, 27, 237, 0, 29, 237, 0, 78, 250, 0,
-    79, 247, 0,
-    82, 250, 0, 83, 237, 0, 87, 237, 0, 89, 237, 0, 91, 237, 0, 109, 247, 0,
-    113, 237, 0,
-    115, 237, 0, 117, 237, 13, 45, 250, 47, 250, 66, 250, 193, 250, 194, 250,
-    195, 250,
-    196, 250, 197, 250, 198, 250, 0, 2, 250, 0, 4, 250, 0, 6, 250, 65, 45,
-    236, 46, 244,
-    47, 236, 59, 250, 60, 250, 66, 244, 72, 250, 80, 250, 98, 245, 102, 244,
-    112, 244,
-    118, 245, 193, 244, 194, 244, 195, 244, 196, 244, 197, 244, 198, 244, 211,
-    250,
-    212, 250, 213, 250, 214, 250, 215, 250, 217, 250, 225, 245, 226, 245, 227,
-    245,
-    228, 245, 229, 245, 230, 245, 233, 244, 234, 244, 235, 244, 236, 244, 243,
-    244,
-    244, 244, 245, 244, 246, 244, 247, 244, 249, 244, 250, 245, 251, 245, 252,
-    245,
-    253, 245, 0, 2, 244, 0, 3, 245, 0, 4, 244, 0, 5, 245, 0, 6, 244, 0, 7,
-    245, 0, 21, 244,
-    0, 25, 244, 0, 27, 244, 0, 29, 244, 0, 32, 250, 0, 36, 250, 0, 78, 250, 0,
-    79, 244, 0,
-    82, 250, 0, 83, 244, 0, 109, 245, 0, 113, 245, 0, 115, 245, 0, 117, 245,
-    63, 45, 244,
-    46, 250, 47, 244, 66, 249, 80, 254, 98, 250, 102, 252, 112, 252, 118, 252,
-    122, 254,
-    193, 249, 194, 249, 195, 249, 196, 249, 197, 249, 198, 249, 211, 254, 212,
-    254,
-    213, 254, 214, 254, 215, 254, 217, 254, 225, 250, 226, 250, 227, 250, 228,
-    250,
-    229, 250, 230, 250, 233, 252, 234, 252, 235, 252, 236, 252, 243, 252, 244,
-    252,
-    245, 252, 246, 252, 247, 252, 249, 252, 250, 252, 251, 252, 252, 252, 253,
-    252,
-    254, 254, 0, 1, 254, 0, 2, 249, 0, 3, 250, 0, 4, 249, 0, 5, 250, 0, 6,
-    249, 0, 7, 250,
-    0, 21, 252, 0, 25, 252, 0, 27, 252, 0, 29, 252, 0, 78, 254, 0, 79, 252, 0,
-    82, 254, 0,
-    83, 252, 0, 109, 252, 0, 113, 252, 0, 115, 252, 0, 117, 252, 65, 45, 234,
-    46, 234,
-    47, 234, 59, 247, 60, 247, 66, 239, 80, 243, 98, 234, 102, 234, 106, 254,
-    112, 234,
-    118, 239, 193, 239, 194, 239, 195, 239, 196, 239, 197, 239, 198, 239, 211,
-    243,
-    212, 243, 213, 243, 214, 243, 215, 243, 217, 243, 225, 234, 226, 234, 227,
-    234,
-    228, 234, 229, 234, 230, 234, 233, 234, 234, 234, 235, 234, 236, 234, 238,
-    254,
-    243, 234, 244, 234, 245, 234, 246, 234, 247, 234, 249, 234, 250, 239, 251,
-    239,
-    252, 239, 253, 239, 0, 2, 239, 0, 3, 245, 0, 4, 239, 0, 5, 245, 0, 6, 239,
-    0, 7, 234,
-    0, 21, 245, 0, 25, 234, 0, 27, 234, 0, 29, 234, 0, 49, 254, 0, 78, 243, 0,
-    79, 234, 0,
-    82, 243, 0, 83, 234, 0, 109, 239, 0, 113, 239, 0, 115, 239, 0, 117, 239,
-    6, 119, 254,
-    120, 254, 122, 252, 254, 252, 0, 1, 252, 21, 45, 250, 47, 250, 99, 255,
-    109, 254,
-    118, 254, 119, 254, 122, 254, 250, 254, 251, 254, 252, 254, 253, 254, 254,
-    254,
-    0, 1, 254, 0, 60, 254, 0, 62, 254, 0, 68, 254, 0, 109, 254, 0, 113, 254,
-    0, 115, 254,
-    0, 117, 254, 4, 45, 254, 108, 254, 0, 57, 254, 9, 45, 254, 47, 254, 119,
-    252, 120,
-    254, 121, 252, 122, 254, 254, 254, 0, 1, 254, 34, 45, 252, 47, 252, 98,
-    252, 102,
-    252, 112, 252, 225, 252, 226, 252, 227, 252, 228, 252, 229, 252, 230, 252,
-    233,
-    252, 234, 252, 235, 252, 236, 252, 243, 252, 244, 252, 245, 252, 246, 252,
-    247,
-    252, 249, 252, 0, 3, 252, 0, 5, 252, 0, 7, 252, 0, 21, 252, 0, 25, 252, 0,
-    27, 252, 0,
-    29, 252, 0, 51, 252, 0, 79, 252, 0, 83, 252, 1, 32, 25, 8, 1, 32, 29, 10,
-    5, 115, 255,
-    0, 87, 255, 0, 89, 255, 0, 91, 255, 4, 122, 252, 254, 252, 0, 1, 252, 19,
-    102, 254,
-    112, 254, 233, 254, 234, 254, 235, 254, 236, 254, 243, 254, 244, 254, 245,
-    254,
-    246, 254, 247, 254, 249, 254, 0, 21, 254, 0, 25, 254, 0, 27, 254, 0, 29,
-    254, 0, 79,
-    254, 0, 83, 254, 13, 118, 255, 122, 254, 250, 255, 251, 255, 252, 255,
-    253, 255,
-    254, 254, 0, 1, 254, 0, 109, 255, 0, 113, 255, 0, 115, 255, 0, 117, 255,
-    14, 118, 255,
-    119, 254, 122, 254, 250, 255, 251, 255, 252, 255, 253, 255, 254, 254, 0,
-    1, 254,
-    0, 109, 255, 0, 113, 255, 0, 115, 255, 0, 117, 255, 9, 45, 250, 47, 250,
-    119, 254,
-    120, 254, 121, 252, 122, 252, 254, 252, 0, 1, 252, 6, 45, 251, 47, 251,
-    122, 252,
-    254, 252, 0, 1, 252, 50, 45, 249, 47, 249, 59, 5, 60, 5, 98, 255, 106, 3,
-    108, 3, 109,
-    3, 110, 4, 111, 4, 113, 5, 117, 7, 118, 3, 119, 5, 122, 5, 225, 255, 226,
-    255, 227,
-    255, 228, 255, 229, 255, 230, 255, 237, 3, 238, 3, 239, 3, 240, 3, 242, 4,
-    250, 3,
-    251, 3, 252, 3, 253, 3, 254, 5, 0, 1, 5, 0, 3, 255, 0, 5, 255, 0, 7, 255,
-    0, 45, 3, 0, 49,
-    3, 0, 57, 3, 0, 60, 3, 0, 62, 3, 0, 68, 3, 0, 70, 4, 0, 72, 4, 0, 74, 4,
-    0, 101, 7, 0, 109,
-    3, 0, 113, 3, 0, 115, 3, 0, 117, 3, 4, 45, 254, 47, 254, 120, 252, 31, 45,
-    244, 47, 244,
-    98, 253, 102, 253, 112, 253, 225, 253, 226, 253, 227, 253, 228, 253, 229,
-    253, 230,
-    253, 233, 253, 234, 253, 235, 253, 236, 253, 243, 253, 244, 253, 245, 253,
-    246,
-    253, 247, 253, 249, 253, 0, 3, 253, 0, 5, 253, 0, 7, 253, 0, 21, 253, 0,
-    25, 253, 0,
-    27, 253, 0, 29, 253, 0, 79, 253, 0, 83, 253, 31, 45, 247, 47, 247, 98,
-    254, 102, 255,
-    112, 255, 225, 254, 226, 254, 227, 254, 228, 254, 229, 254, 230, 254, 233,
-    255,
-    234, 255, 235, 255, 236, 255, 243, 255, 244, 255, 245, 255, 246, 255, 247,
-    255,
-    249, 255, 0, 3, 254, 0, 5, 254, 0, 7, 254, 0, 21, 255, 0, 25, 255, 0, 27,
-    255, 0, 29,
-    255, 0, 79, 255, 0, 83, 255, 10, 102, 252, 233, 252, 234, 252, 235, 252,
-    236, 252,
-    0, 21, 252, 0, 25, 252, 0, 27, 252, 0, 29, 252, 31, 45, 240, 47, 240, 98,
-    254, 102,
-    254, 112, 254, 225, 254, 226, 254, 227, 254, 228, 254, 229, 254, 230, 254,
-    233,
-    254, 234, 254, 235, 254, 236, 254, 243, 254, 244, 254, 245, 254, 246, 254,
-    247,
-    254, 249, 254, 0, 3, 254, 0, 5, 254, 0, 7, 254, 0, 21, 254, 0, 25, 254, 0,
-    27, 254, 0,
-    29, 254, 0, 79, 254, 0, 83, 254, 19, 102, 254, 112, 254, 233, 254, 234,
-    254, 235,
-    254, 236, 254, 243, 254, 244, 254, 245, 254, 246, 254, 247, 254, 249, 254,
-    0, 21,
-    254, 0, 25, 254, 0, 27, 254, 0, 29, 254, 0, 79, 254, 0, 83, 254, 49, 68,
-    252, 72, 252,
-    80, 252, 82, 252, 85, 237, 86, 249, 87, 245, 88, 249, 90, 240, 118, 252,
-    119, 250,
-    120, 250, 122, 250, 200, 252, 211, 252, 212, 252, 213, 252, 214, 252, 215,
-    252,
-    217, 252, 218, 249, 219, 249, 220, 249, 221, 249, 222, 240, 250, 252, 251,
-    252,
-    252, 252, 253, 252, 254, 250, 0, 1, 250, 0, 8, 252, 0, 14, 252, 0, 32,
-    252, 0, 36, 252,
-    0, 78, 252, 0, 82, 252, 0, 100, 237, 0, 102, 237, 0, 108, 249, 0, 109,
-    252, 0, 112,
-    249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116, 249, 0, 117, 252, 0,
-    122, 240,
-    49, 68, 252, 72, 252, 80, 252, 82, 252, 85, 237, 86, 249, 87, 245, 88,
-    249, 90, 240,
-    118, 252, 119, 250, 120, 250, 122, 250, 200, 252, 211, 252, 212, 252, 213,
-    252,
-    214, 252, 215, 252, 217, 252, 218, 249, 219, 249, 220, 249, 221, 249, 222,
-    240,
-    250, 252, 251, 252, 252, 252, 253, 252, 254, 250, 0, 1, 250, 0, 8, 252, 0,
-    14, 252,
-    0, 32, 252, 0, 36, 252, 0, 78, 252, 0, 82, 252, 0, 100, 237, 0, 102, 237,
-    0, 108, 249,
-    0, 109, 252, 0, 112, 249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116,
-    249, 0, 117,
-    252, 0, 122, 240, 49, 68, 252, 72, 252, 80, 252, 82, 252, 85, 237, 86,
-    249, 87, 245,
-    88, 249, 90, 240, 118, 252, 119, 250, 120, 250, 122, 250, 200, 252, 211,
-    252, 212,
-    252, 213, 252, 214, 252, 215, 252, 217, 252, 218, 249, 219, 249, 220, 249,
-    221,
-    249, 222, 240, 250, 252, 251, 252, 252, 252, 253, 252, 254, 250, 0, 1,
-    250, 0, 8,
-    252, 0, 14, 252, 0, 32, 252, 0, 36, 252, 0, 78, 252, 0, 82, 252, 0, 100,
-    237, 0, 102,
-    237, 0, 108, 249, 0, 109, 252, 0, 112, 249, 0, 113, 252, 0, 114, 249, 0,
-    115, 252,
-    0, 116, 249, 0, 117, 252, 0, 122, 240, 49, 68, 252, 72, 252, 80, 252, 82,
-    252, 85,
-    237, 86, 249, 87, 245, 88, 249, 90, 240, 118, 252, 119, 250, 120, 250,
-    122, 250,
-    200, 252, 211, 252, 212, 252, 213, 252, 214, 252, 215, 252, 217, 252, 218,
-    249,
-    219, 249, 220, 249, 221, 249, 222, 240, 250, 252, 251, 252, 252, 252, 253,
-    252,
-    254, 250, 0, 1, 250, 0, 8, 252, 0, 14, 252, 0, 32, 252, 0, 36, 252, 0, 78,
-    252, 0, 82,
-    252, 0, 100, 237, 0, 102, 237, 0, 108, 249, 0, 109, 252, 0, 112, 249, 0,
-    113, 252,
-    0, 114, 249, 0, 115, 252, 0, 116, 249, 0, 117, 252, 0, 122, 240, 49, 68,
-    252, 72, 252,
-    80, 252, 82, 252, 85, 237, 86, 249, 87, 245, 88, 249, 90, 240, 118, 252,
-    119, 250,
-    120, 250, 122, 250, 200, 252, 211, 252, 212, 252, 213, 252, 214, 252, 215,
-    252,
-    217, 252, 218, 249, 219, 249, 220, 249, 221, 249, 222, 240, 250, 252, 251,
-    252,
-    252, 252, 253, 252, 254, 250, 0, 1, 250, 0, 8, 252, 0, 14, 252, 0, 32,
-    252, 0, 36, 252,
-    0, 78, 252, 0, 82, 252, 0, 100, 237, 0, 102, 237, 0, 108, 249, 0, 109,
-    252, 0, 112,
-    249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116, 249, 0, 117, 252, 0,
-    122, 240,
-    49, 68, 252, 72, 252, 80, 252, 82, 252, 85, 237, 86, 249, 87, 245, 88,
-    249, 90, 240,
-    118, 252, 119, 250, 120, 250, 122, 250, 200, 252, 211, 252, 212, 252, 213,
-    252,
-    214, 252, 215, 252, 217, 252, 218, 249, 219, 249, 220, 249, 221, 249, 222,
-    240,
-    250, 252, 251, 252, 252, 252, 253, 252, 254, 250, 0, 1, 250, 0, 8, 252, 0,
-    14, 252,
-    0, 32, 252, 0, 36, 252, 0, 78, 252, 0, 82, 252, 0, 100, 237, 0, 102, 237,
-    0, 108, 249,
-    0, 109, 252, 0, 112, 249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116,
-    249, 0, 117,
-    252, 0, 122, 240, 3, 45, 252, 47, 252, 22, 45, 250, 47, 250, 66, 254, 85,
-    250, 87,
-    249, 88, 252, 89, 247, 90, 245, 193, 254, 194, 254, 195, 254, 196, 254,
-    197, 254,
-    198, 254, 222, 245, 0, 2, 254, 0, 4, 254, 0, 6, 254, 0, 100, 250, 0, 102,
-    250, 0, 122,
-    245, 22, 45, 250, 47, 250, 66, 254, 85, 250, 87, 249, 88, 252, 89, 247,
-    90, 245, 193,
-    254, 194, 254, 195, 254, 196, 254, 197, 254, 198, 254, 222, 245, 0, 2,
-    254, 0, 4,
-    254, 0, 6, 254, 0, 100, 250, 0, 102, 250, 0, 122, 245, 22, 45, 250, 47,
-    250, 66, 254,
-    85, 250, 87, 249, 88, 252, 89, 247, 90, 245, 193, 254, 194, 254, 195, 254,
-    196, 254,
-    197, 254, 198, 254, 222, 245, 0, 2, 254, 0, 4, 254, 0, 6, 254, 0, 100,
-    250, 0, 102,
-    250, 0, 122, 245, 22, 45, 250, 47, 250, 66, 254, 85, 250, 87, 249, 88,
-    252, 89, 247,
-    90, 245, 193, 254, 194, 254, 195, 254, 196, 254, 197, 254, 198, 254, 222,
-    245, 0,
-    2, 254, 0, 4, 254, 0, 6, 254, 0, 100, 250, 0, 102, 250, 0, 122, 245, 22,
-    45, 250, 47,
-    250, 66, 254, 85, 250, 87, 249, 88, 252, 89, 247, 90, 245, 193, 254, 194,
-    254, 195,
-    254, 196, 254, 197, 254, 198, 254, 222, 245, 0, 2, 254, 0, 4, 254, 0, 6,
-    254, 0, 100,
-    250, 0, 102, 250, 0, 122, 245, 22, 45, 250, 47, 250, 66, 254, 85, 250, 87,
-    249, 88,
-    252, 89, 247, 90, 245, 193, 254, 194, 254, 195, 254, 196, 254, 197, 254,
-    198, 254,
-    222, 245, 0, 2, 254, 0, 4, 254, 0, 6, 254, 0, 100, 250, 0, 102, 250, 0,
-    122, 245, 13,
-    45, 250, 47, 250, 66, 250, 193, 250, 194, 250, 195, 250, 196, 250, 197,
-    250, 198,
-    250, 0, 2, 250, 0, 4, 250, 0, 6, 250, 13, 45, 250, 47, 250, 66, 250, 193,
-    250, 194,
-    250, 195, 250, 196, 250, 197, 250, 198, 250, 0, 2, 250, 0, 4, 250, 0, 6,
-    250, 13, 45,
-    250, 47, 250, 66, 250, 193, 250, 194, 250, 195, 250, 196, 250, 197, 250,
-    198, 250,
-    0, 2, 250, 0, 4, 250, 0, 6, 250, 13, 45, 250, 47, 250, 66, 250, 193, 250,
-    194, 250,
-    195, 250, 196, 250, 197, 250, 198, 250, 0, 2, 250, 0, 4, 250, 0, 6, 250,
-    65, 45, 234,
-    46, 234, 47, 234, 59, 247, 60, 247, 66, 239, 80, 243, 98, 234, 102, 234,
-    106, 254,
-    112, 234, 118, 239, 193, 239, 194, 239, 195, 239, 196, 239, 197, 239, 198,
-    239,
-    211, 243, 212, 243, 213, 243, 214, 243, 215, 243, 217, 243, 225, 234, 226,
-    234,
-    227, 234, 228, 245, 229, 234, 230, 234, 233, 234, 234, 234, 235, 234, 236,
-    234,
-    238, 254, 243, 234, 244, 234, 245, 234, 246, 234, 247, 234, 249, 234, 250,
-    239,
-    251, 239, 252, 239, 253, 239, 0, 2, 239, 0, 3, 245, 0, 4, 239, 0, 5, 245,
-    0, 6, 239,
-    0, 7, 234, 0, 21, 245, 0, 25, 234, 0, 27, 234, 0, 29, 234, 0, 49, 254, 0,
-    78, 243, 0,
-    79, 245, 0, 82, 243, 0, 83, 234, 0, 109, 239, 0, 113, 239, 0, 115, 239, 0,
-    117, 239,
-    6, 119, 254, 120, 254, 122, 252, 254, 252, 0, 1, 252, 6, 119, 254, 120,
-    254, 122,
-    252, 254, 252, 0, 1, 252, 6, 119, 254, 120, 254, 122, 252, 254, 252, 0, 1,
-    252, 6,
-    119, 254, 120, 254, 122, 252, 254, 252, 0, 1, 252, 6, 119, 254, 120, 254,
-    122, 252,
-    254, 252, 0, 1, 252, 6, 119, 254, 120, 254, 122, 252, 254, 252, 0, 1, 252,
-    4, 45, 254,
-    108, 254, 0, 57, 254, 9, 45, 254, 47, 254, 119, 252, 120, 254, 121, 252,
-    122, 254,
-    254, 254, 0, 1, 254, 9, 45, 254, 47, 254, 119, 252, 120, 254, 121, 252,
-    122, 254,
-    254, 254, 0, 1, 254, 9, 45, 254, 47, 254, 119, 252, 120, 254, 121, 252,
-    122, 254,
-    254, 254, 0, 1, 254, 9, 45, 254, 47, 254, 119, 252, 120, 254, 121, 252,
-    122, 254,
-    254, 254, 0, 1, 254, 14, 118, 255, 119, 254, 122, 254, 250, 255, 251, 255,
-    252, 255,
-    253, 255, 254, 254, 0, 1, 254, 0, 109, 255, 0, 113, 255, 0, 115, 255, 0,
-    117, 255,
-    9, 45, 250, 47, 250, 119, 254, 120, 254, 121, 252, 122, 252, 254, 252, 0,
-    1, 252,
-    9, 45, 250, 47, 250, 119, 254, 120, 254, 121, 252, 122, 252, 254, 252, 0,
-    1, 252,
-    9, 45, 250, 47, 250, 119, 254, 120, 254, 121, 252, 122, 252, 254, 252, 0,
-    1, 252,
-    9, 45, 250, 47, 250, 119, 254, 120, 254, 121, 252, 122, 252, 254, 252, 0,
-    1, 252,
-    9, 45, 250, 47, 250, 119, 254, 120, 254, 121, 252, 122, 252, 254, 252, 0,
-    1, 252,
-    95, 45, 241, 47, 241, 98, 248, 99, 248, 100, 248, 101, 248, 102, 248, 103,
-    248, 104,
-    248, 105, 248, 106, 248, 107, 248, 108, 248, 109, 248, 110, 248, 111, 248,
-    112,
-    248, 113, 248, 114, 248, 115, 248, 116, 248, 117, 248, 118, 248, 119, 245,
-    120,
-    245, 121, 243, 122, 245, 123, 248, 225, 248, 226, 248, 227, 248, 228, 248,
-    229,
-    248, 230, 248, 232, 248, 233, 248, 234, 248, 235, 248, 236, 248, 237, 248,
-    238,
-    248, 239, 248, 240, 248, 242, 248, 243, 248, 244, 248, 245, 248, 246, 248,
-    247,
-    248, 249, 248, 250, 248, 251, 248, 252, 248, 253, 248, 254, 245, 0, 1,
-    245, 0, 3,
-    248, 0, 5, 248, 0, 7, 248, 0, 9, 248, 0, 15, 248, 0, 19, 248, 0, 21, 248,
-    0, 25, 248,
-    0, 27, 248, 0, 29, 248, 0, 33, 248, 0, 37, 248, 0, 45, 248, 0, 49, 248, 0,
-    57, 248, 0,
-    60, 248, 0, 62, 248, 0, 68, 248, 0, 70, 248, 0, 72, 248, 0, 74, 248, 0,
-    79, 248, 0, 83,
-    248, 0, 87, 248, 0, 89, 248, 0, 91, 248, 0, 93, 248, 0, 97, 248, 0, 99,
-    248, 0, 101,
-    248, 0, 109, 248, 0, 113, 248, 0, 115, 248, 0, 117, 248, 0, 124, 248, 0,
-    126, 248,
-    0, 128, 248, 1, 2, 25, 248, 31, 45, 240, 47, 240, 98, 254, 102, 254, 112,
-    254, 225,
-    254, 226, 254, 227, 254, 228, 254, 229, 254, 230, 254, 233, 254, 234, 254,
-    235,
-    254, 236, 254, 243, 254, 244, 254, 245, 254, 246, 254, 247, 254, 249, 254,
-    0, 3,
-    254, 0, 5, 254, 0, 7, 254, 0, 21, 254, 0, 25, 254, 0, 27, 254, 0, 29, 254,
-    0, 79, 254,
-    0, 83, 254, 31, 45, 240, 47, 240, 98, 254, 102, 254, 112, 254, 225, 254,
-    226, 254,
-    227, 254, 228, 254, 229, 254, 230, 254, 233, 254, 234, 254, 235, 254, 236,
-    254,
-    243, 254, 244, 254, 245, 254, 246, 254, 247, 254, 249, 254, 0, 3, 254, 0,
-    5, 254,
-    0, 7, 254, 0, 21, 254, 0, 25, 254, 0, 27, 254, 0, 29, 254, 0, 79, 254, 0,
-    83, 254, 49,
-    68, 252, 72, 252, 80, 252, 82, 252, 85, 237, 86, 249, 87, 245, 88, 249,
-    90, 240, 118,
-    252, 119, 250, 120, 250, 122, 250, 200, 252, 211, 252, 212, 252, 213, 252,
-    214,
-    252, 215, 252, 217, 252, 218, 249, 219, 249, 220, 249, 221, 249, 222, 240,
-    250,
-    252, 251, 252, 252, 252, 253, 252, 254, 250, 0, 1, 250, 0, 8, 252, 0, 14,
-    252, 0, 32,
-    252, 0, 36, 252, 0, 78, 252, 0, 82, 252, 0, 100, 237, 0, 102, 237, 0, 108,
-    249, 0, 109,
-    252, 0, 112, 249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116, 249, 0,
-    117, 252,
-    0, 122, 240, 6, 119, 254, 120, 254, 122, 252, 254, 252, 0, 1, 252, 49, 68,
-    252, 72,
-    252, 80, 252, 82, 252, 85, 237, 86, 249, 87, 245, 88, 249, 90, 240, 118,
-    252, 119,
-    250, 120, 250, 122, 250, 200, 252, 211, 252, 212, 252, 213, 252, 214, 252,
-    215,
-    252, 217, 252, 218, 249, 219, 249, 220, 249, 221, 249, 222, 240, 250, 252,
-    251,
-    252, 252, 252, 253, 252, 254, 250, 0, 1, 250, 0, 8, 252, 0, 14, 252, 0,
-    32, 252, 0,
-    36, 252, 0, 78, 252, 0, 82, 252, 0, 100, 237, 0, 102, 237, 0, 108, 249, 0,
-    109, 252,
-    0, 112, 249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116, 249, 0, 117,
-    252, 0, 122,
-    240, 6, 119, 254, 120, 254, 122, 252, 254, 252, 0, 1, 252, 49, 68, 252,
-    72, 252, 80,
-    252, 82, 252, 85, 237, 86, 249, 87, 245, 88, 249, 90, 240, 118, 252, 119,
-    250, 120,
-    250, 122, 250, 200, 252, 211, 252, 212, 252, 213, 252, 214, 252, 215, 252,
-    217,
-    252, 218, 249, 219, 249, 220, 249, 221, 249, 222, 240, 250, 252, 251, 252,
-    252,
-    252, 253, 252, 254, 250, 0, 1, 250, 0, 8, 252, 0, 14, 252, 0, 32, 252, 0,
-    36, 252, 0,
-    78, 252, 0, 82, 252, 0, 100, 237, 0, 102, 237, 0, 108, 249, 0, 109, 252,
-    0, 112, 249,
-    0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116, 249, 0, 117, 252, 0, 122,
-    240, 6, 119,
-    254, 120, 254, 122, 252, 254, 252, 0, 1, 252, 3, 45, 252, 47, 252, 4, 45,
-    254, 108,
-    254, 0, 57, 254, 3, 45, 252, 47, 252, 4, 45, 254, 108, 254, 0, 57, 254,
-    18, 45, 245,
-    47, 245, 66, 250, 87, 245, 88, 250, 90, 242, 193, 250, 194, 250, 195, 250,
-    196, 250,
-    197, 250, 198, 250, 222, 242, 0, 2, 250, 0, 4, 250, 0, 6, 250, 0, 122,
-    242, 18, 45,
-    245, 47, 245, 66, 250, 87, 245, 88, 250, 90, 242, 193, 250, 194, 250, 195,
-    250, 196,
-    250, 197, 250, 198, 250, 222, 242, 0, 2, 250, 0, 4, 250, 0, 6, 250, 0,
-    122, 242, 9,
-    45, 254, 47, 254, 119, 252, 120, 254, 121, 252, 122, 254, 254, 254, 0, 1,
-    254, 9,
-    45, 254, 47, 254, 119, 252, 120, 254, 121, 252, 122, 254, 254, 254, 0, 1,
-    254, 9,
-    45, 254, 47, 254, 119, 252, 120, 254, 121, 252, 122, 254, 254, 254, 0, 1,
-    254, 9,
-    45, 254, 47, 254, 119, 252, 120, 254, 121, 252, 122, 254, 254, 254, 0, 1,
-    254, 5,
-    115, 255, 0, 87, 255, 0, 89, 255, 0, 91, 255, 5, 115, 255, 0, 87, 255, 0,
-    89, 255, 0,
-    91, 255, 40, 80, 249, 102, 250, 112, 250, 118, 252, 122, 249, 211, 249,
-    212, 249,
-    213, 249, 214, 249, 215, 249, 217, 249, 233, 250, 234, 250, 235, 250, 236,
-    250,
-    243, 250, 244, 250, 245, 250, 246, 250, 247, 250, 249, 250, 250, 252, 251,
-    252,
-    252, 252, 253, 252, 254, 249, 0, 1, 249, 0, 21, 250, 0, 25, 250, 0, 27,
-    250, 0, 29,
-    250, 0, 78, 249, 0, 79, 250, 0, 82, 249, 0, 83, 250, 0, 109, 252, 0, 113,
-    252, 0, 115,
-    252, 0, 117, 252, 19, 102, 254, 112, 254, 233, 254, 234, 254, 235, 254,
-    236, 254,
-    243, 254, 244, 254, 245, 254, 246, 254, 247, 254, 249, 254, 0, 21, 254, 0,
-    25, 254,
-    0, 27, 254, 0, 29, 254, 0, 79, 254, 0, 83, 254, 14, 85, 239, 87, 239, 88,
-    245, 90, 234,
-    122, 252, 222, 234, 254, 252, 0, 1, 252, 0, 100, 239, 0, 102, 239, 0, 122,
-    234, 1,
-    32, 25, 230, 1, 32, 29, 234, 14, 85, 239, 87, 239, 88, 245, 90, 234, 122,
-    252, 222,
-    234, 254, 252, 0, 1, 252, 0, 100, 239, 0, 102, 239, 0, 122, 234, 1, 32,
-    25, 230, 1,
-    32, 29, 234, 14, 85, 239, 87, 239, 88, 245, 90, 234, 122, 252, 222, 234,
-    254, 252,
-    0, 1, 252, 0, 100, 239, 0, 102, 239, 0, 122, 234, 1, 32, 25, 230, 1, 32,
-    29, 234, 14,
-    85, 239, 87, 239, 88, 245, 90, 234, 122, 252, 222, 234, 254, 252, 0, 1,
-    252, 0, 100,
-    239, 0, 102, 239, 0, 122, 234, 1, 32, 25, 230, 1, 32, 29, 234, 14, 118,
-    255, 119, 254,
-    122, 254, 250, 255, 251, 255, 252, 255, 253, 255, 254, 254, 0, 1, 254, 0,
-    109, 255,
-    0, 113, 255, 0, 115, 255, 0, 117, 255, 14, 118, 255, 119, 254, 122, 254,
-    250, 255,
-    251, 255, 252, 255, 253, 255, 254, 254, 0, 1, 254, 0, 109, 255, 0, 113,
-    255, 0, 115,
-    255, 0, 117, 255, 14, 118, 255, 119, 254, 122, 254, 250, 255, 251, 255,
-    252, 255,
-    253, 255, 254, 254, 0, 1, 254, 0, 109, 255, 0, 113, 255, 0, 115, 255, 0,
-    117, 255,
-    22, 45, 250, 47, 250, 66, 254, 85, 250, 87, 249, 88, 252, 89, 247, 90,
-    245, 193, 254,
-    194, 254, 195, 254, 196, 254, 197, 254, 198, 254, 222, 245, 0, 2, 254, 0,
-    4, 254,
-    0, 6, 254, 0, 100, 250, 0, 102, 250, 0, 122, 245, 9, 45, 250, 47, 250,
-    119, 254, 120,
-    254, 121, 252, 122, 252, 254, 252, 0, 1, 252, 22, 45, 250, 47, 250, 66,
-    254, 85, 250,
-    87, 249, 88, 252, 89, 247, 90, 245, 193, 254, 194, 254, 195, 254, 196,
-    254, 197,
-    254, 198, 254, 222, 245, 0, 2, 254, 0, 4, 254, 0, 6, 254, 0, 100, 250, 0,
-    102, 250,
-    0, 122, 245, 9, 45, 250, 47, 250, 119, 254, 120, 254, 121, 252, 122, 252,
-    254, 252,
-    0, 1, 252, 27, 80, 254, 85, 252, 86, 250, 87, 249, 88, 252, 90, 249, 211,
-    254, 212,
-    254, 213, 254, 214, 254, 215, 254, 217, 254, 218, 250, 219, 250, 220, 250,
-    221,
-    250, 222, 249, 0, 78, 254, 0, 82, 254, 0, 100, 252, 0, 102, 252, 0, 108,
-    250, 0, 112,
-    250, 0, 114, 250, 0, 116, 250, 0, 122, 249, 50, 45, 249, 47, 249, 59, 5,
-    60, 5, 98,
-    255, 106, 3, 108, 3, 109, 3, 110, 4, 111, 4, 113, 5, 117, 7, 118, 3, 119,
-    5, 122, 5,
-    225, 255, 226, 255, 227, 255, 228, 255, 229, 255, 230, 255, 237, 3, 238,
-    3, 239,
-    3, 240, 3, 242, 4, 250, 3, 251, 3, 252, 3, 253, 3, 254, 5, 0, 1, 5, 0, 3,
-    255, 0, 5, 255,
-    0, 7, 255, 0, 45, 3, 0, 49, 3, 0, 57, 3, 0, 60, 3, 0, 62, 3, 0, 68, 3, 0,
-    70, 4, 0, 72, 4,
-    0, 74, 4, 0, 101, 7, 0, 109, 3, 0, 113, 3, 0, 115, 3, 0, 117, 3, 27, 80,
-    254, 85, 252,
-    86, 250, 87, 249, 88, 252, 90, 249, 211, 254, 212, 254, 213, 254, 214,
-    254, 215,
-    254, 217, 254, 218, 250, 219, 250, 220, 250, 221, 250, 222, 249, 0, 78,
-    254, 0, 82,
-    254, 0, 100, 252, 0, 102, 252, 0, 108, 250, 0, 112, 250, 0, 114, 250, 0,
-    116, 250,
-    0, 122, 249, 50, 45, 249, 47, 249, 59, 5, 60, 5, 98, 255, 106, 3, 108, 3,
-    109, 3, 110,
-    4, 111, 4, 113, 5, 117, 7, 118, 3, 119, 5, 122, 5, 225, 255, 226, 255,
-    227, 255, 228,
-    255, 229, 255, 230, 255, 237, 3, 238, 3, 239, 3, 240, 3, 242, 4, 250, 3,
-    251, 3, 252,
-    3, 253, 3, 254, 5, 0, 1, 5, 0, 3, 255, 0, 5, 255, 0, 7, 255, 0, 45, 3, 0,
-    49, 3, 0, 57, 3,
-    0, 60, 3, 0, 62, 3, 0, 68, 3, 0, 70, 4, 0, 72, 4, 0, 74, 4, 0, 101, 7, 0,
-    109, 3, 0, 113,
-    3, 0, 115, 3, 0, 117, 3, 27, 80, 254, 85, 252, 86, 250, 87, 249, 88, 252,
-    90, 249, 211,
-    254, 212, 254, 213, 254, 214, 254, 215, 254, 217, 254, 218, 250, 219, 250,
-    220,
-    250, 221, 250, 222, 249, 0, 78, 254, 0, 82, 254, 0, 100, 252, 0, 102, 252,
-    0, 108,
-    250, 0, 112, 250, 0, 114, 250, 0, 116, 250, 0, 122, 249, 50, 45, 249, 47,
-    249, 59,
-    5, 60, 5, 98, 255, 106, 3, 108, 3, 109, 3, 110, 4, 111, 4, 113, 5, 117, 7,
-    118, 3, 119,
-    5, 122, 5, 225, 255, 226, 255, 227, 255, 228, 255, 229, 255, 230, 255,
-    237, 3, 238,
-    3, 239, 3, 240, 3, 242, 4, 250, 3, 251, 3, 252, 3, 253, 3, 254, 5, 0, 1,
-    5, 0, 3, 255,
-    0, 5, 255, 0, 7, 255, 0, 45, 3, 0, 49, 3, 0, 57, 3, 0, 60, 3, 0, 62, 3, 0,
-    68, 3, 0, 70, 4,
-    0, 72, 4, 0, 74, 4, 0, 101, 7, 0, 109, 3, 0, 113, 3, 0, 115, 3, 0, 117, 3,
-    3, 45, 254, 47,
-    254, 4, 45, 254, 47, 254, 120, 252, 3, 45, 254, 47, 254, 4, 45, 254, 47,
-    254, 120,
-    252, 3, 45, 254, 47, 254, 4, 45, 254, 47, 254, 120, 252, 70, 45, 237, 46,
-    234, 47,
-    237, 59, 254, 60, 254, 66, 237, 80, 250, 98, 237, 102, 237, 112, 237, 115,
-    237, 118,
-    237, 120, 237, 122, 237, 193, 237, 194, 237, 195, 237, 196, 237, 197, 237,
-    198,
-    237, 211, 250, 212, 250, 213, 250, 214, 250, 215, 250, 217, 250, 225, 237,
-    226,
-    237, 227, 237, 228, 247, 229, 237, 230, 237, 233, 247, 234, 237, 235, 237,
-    236,
-    237, 243, 237, 244, 237, 245, 237, 246, 247, 247, 237, 249, 237, 250, 237,
-    251,
-    237, 252, 237, 253, 237, 254, 237, 0, 1, 247, 0, 2, 237, 0, 3, 247, 0, 4,
-    237, 0, 5,
-    247, 0, 6, 237, 0, 7, 237, 0, 21, 247, 0, 25, 237, 0, 27, 237, 0, 29, 237,
-    0, 78, 250,
-    0, 79, 247, 0, 82, 250, 0, 83, 237, 0, 87, 237, 0, 89, 237, 0, 91, 237, 0,
-    109, 247,
-    0, 113, 237, 0, 115, 237, 0, 117, 237, 70, 45, 237, 46, 234, 47, 237, 59,
-    254, 60,
-    254, 66, 237, 80, 250, 98, 237, 102, 237, 112, 237, 115, 237, 118, 237,
-    120, 237,
-    122, 237, 193, 237, 194, 237, 195, 237, 196, 237, 197, 237, 198, 237, 211,
-    250,
-    212, 250, 213, 250, 214, 250, 215, 250, 217, 250, 225, 237, 226, 237, 227,
-    237,
-    228, 247, 229, 237, 230, 237, 233, 247, 234, 237, 235, 237, 236, 237, 243,
-    237,
-    244, 237, 245, 237, 246, 247, 247, 237, 249, 237, 250, 237, 251, 237, 252,
-    237,
-    253, 237, 254, 237, 0, 1, 247, 0, 2, 237, 0, 3, 247, 0, 4, 237, 0, 5, 247,
-    0, 6, 237,
-    0, 7, 237, 0, 21, 247, 0, 25, 237, 0, 27, 237, 0, 29, 237, 0, 78, 250, 0,
-    79, 247, 0,
-    82, 250, 0, 83, 237, 0, 87, 237, 0, 89, 237, 0, 91, 237, 0, 109, 247, 0,
-    113, 237, 0,
-    115, 237, 0, 117, 237, 13, 45, 250, 47, 250, 66, 250, 193, 250, 194, 250,
-    195, 250,
-    196, 250, 197, 250, 198, 250, 0, 2, 250, 0, 4, 250, 0, 6, 250, 13, 45,
-    250, 47, 250,
-    66, 250, 193, 250, 194, 250, 195, 250, 196, 250, 197, 250, 198, 250, 0, 2,
-    250, 0,
-    4, 250, 0, 6, 250, 13, 45, 250, 47, 250, 66, 250, 193, 250, 194, 250, 195,
-    250, 196,
-    250, 197, 250, 198, 250, 0, 2, 250, 0, 4, 250, 0, 6, 250, 13, 45, 250, 47,
-    250, 66,
-    250, 193, 250, 194, 250, 195, 250, 196, 250, 197, 250, 198, 250, 0, 2,
-    250, 0, 4,
-    250, 0, 6, 250, 65, 45, 234, 46, 234, 47, 234, 59, 247, 60, 247, 66, 239,
-    80, 243,
-    98, 234, 102, 234, 106, 254, 112, 234, 118, 239, 193, 239, 194, 239, 195,
-    239, 196,
-    239, 197, 239, 198, 239, 211, 243, 212, 243, 213, 243, 214, 243, 215, 243,
-    217,
-    243, 225, 234, 226, 234, 227, 234, 228, 245, 229, 234, 230, 234, 233, 234,
-    234,
-    234, 235, 234, 236, 234, 238, 254, 243, 234, 244, 234, 245, 234, 246, 234,
-    247,
-    234, 249, 234, 250, 239, 251, 239, 252, 239, 253, 239, 0, 2, 239, 0, 3,
-    245, 0, 4,
-    239, 0, 5, 245, 0, 6, 239, 0, 7, 234, 0, 21, 245, 0, 25, 234, 0, 27, 234,
-    0, 29, 234,
-    0, 49, 254, 0, 78, 243, 0, 79, 234, 0, 82, 243, 0, 83, 234, 0, 109, 239,
-    0, 113, 239,
-    0, 115, 239, 0, 117, 239, 19, 102, 254, 112, 254, 233, 254, 234, 254, 235,
-    254, 236,
-    254, 243, 254, 244, 254, 245, 254, 246, 254, 247, 254, 249, 254, 0, 21,
-    254, 0, 25,
-    254, 0, 27, 254, 0, 29, 254, 0, 79, 254, 0, 83, 254, 19, 102, 254, 112,
-    254, 233, 254,
-    234, 254, 235, 254, 236, 254, 243, 254, 244, 254, 245, 254, 246, 254, 247,
-    254,
-    249, 254, 0, 21, 254, 0, 25, 254, 0, 27, 254, 0, 29, 254, 0, 79, 254, 0,
-    83, 254, 19,
-    102, 254, 112, 254, 233, 254, 234, 254, 235, 254, 236, 254, 243, 254, 244,
-    254,
-    245, 254, 246, 254, 247, 254, 249, 254, 0, 21, 254, 0, 25, 254, 0, 27,
-    254, 0, 29,
-    254, 0, 79, 254, 0, 83, 254, 3, 45, 254, 47, 254, 4, 45, 254, 47, 254,
-    120, 252, 2,
-    1, 32, 24, 247, 14, 33, 245, 101, 249, 115, 249, 116, 249, 0, 19, 249, 0,
-    87, 249,
-    0, 89, 249, 0, 91, 249, 0, 93, 249, 0, 97, 249, 0, 99, 249, 1, 2, 25, 249,
-    1, 32, 25,
-    247, 2, 33, 250
-};
-static afm_cuint16 afm_Helvetica_Oblique_highchars_index[] = {  /* 220 */
-    161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176,
-    177,
-    178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192,
-    193,
-    194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208,
-    209,
-    210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224,
-    225,
-    226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240,
-    241,
-    242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256,
-    257,
-    258, 259, 260, 261, 262, 263, 268, 269, 270, 271, 272, 273, 274, 275, 278,
-    279,
-    280, 281, 282, 283, 286, 287, 290, 291, 298, 299, 302, 303, 304, 305, 310,
-    311,
-    313, 314, 315, 316, 317, 318, 321, 322, 323, 324, 325, 326, 327, 328, 332,
-    333,
-    336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 350, 351, 352,
-    353,
-    354, 355, 356, 357, 362, 363, 366, 367, 368, 369, 370, 371, 376, 377, 378,
-    379,
-    380, 381, 382, 402, 536, 537, 710, 711, 728, 729, 730, 731, 732, 733,
-    8211, 8212,
-    8216, 8217, 8218, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8249,
-    8250,
-    8260, 8364, 8482, 8706, 8710, 8721, 8722, 8730, 8800, 8804, 8805, 9674,
-    63171,
-    64257, 64258
-};
-static afm_cunicode afm_Helvetica_Oblique_ligatures[] = {   /* 3 */
-    102, 105, 64257
-};
-
-
-/* ------------------------------------------------------------------*/
-/* FontName: ZapfDingbats */
-/* FullName: ITC Zapf Dingbats */
-/* FamilyName: ZapfDingbats */
-static afm_cuint8 afm_ZapfDingbats_widths[] = { /* 202 */
-    46, 162, 160, 162, 163, 120, 132, 132, 132, 115, 160, 157, 92, 143, 152,
-    156, 152,
-    158, 162, 126, 141, 127, 127, 95, 113, 127, 127, 127, 126, 82, 92, 90, 96,
-    115, 131,
-    131, 131, 132, 132, 132, 136, 137, 132, 140, 137, 139, 136, 139, 154, 124,
-    121,
-    125, 132, 132, 116, 129, 128, 132, 127, 118, 118, 114, 117, 138, 136, 132,
-    132,
-    118, 115, 116, 115, 131, 131, 119, 132, 131, 132, 146, 127, 127, 127, 127,
-    127,
-    149, 149, 131, 131, 73, 23, 46, 69, 65, 65, 111, 111, 65, 65, 53, 53, 46,
-    46, 85, 85,
-    68, 68, 39, 39, 56, 56, 122, 91, 91, 152, 111, 127, 127, 129, 99, 116,
-    104, 131, 131,
-    131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-    131,
-    131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-    131,
-    131, 131, 131, 131, 131, 131, 149, 140, 169, 76, 125, 154, 125, 153, 155,
-    155, 155,
-    139, 146, 138, 154, 154, 153, 155, 155, 77, 147, 139, 139, 145, 145, 116,
-    116, 146,
-    146, 127, 158, 129, 144, 129, 148, 161, 148, 139, 146, 155, 162, 153
-};
-static afm_cuint16 afm_ZapfDingbats_highchars_index[] = {   /* 107 */
-    128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 161,
-    162,
-    163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177,
-    178,
-    179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193,
-    194,
-    195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209,
-    210,
-    211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225,
-    226,
-    227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 241, 242,
-    243,
-    244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254
-};
-
-
-/* ------------------------------------------------------------------*/
-/* FontName: Symbol */
-/* FullName: Symbol */
-/* FamilyName: Symbol */
-static afm_cuint8 afm_Symbol_widths[] = {   /* 251 */
-    42, 56, 0, 83, 0, 139, 130, 0, 56, 56, 0, 92, 42, 0, 42, 46, 83, 83, 83,
-    83, 83, 83, 83,
-    83, 83, 83, 46, 46, 92, 92, 92, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 56, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 33, 80, 0, 119, 67, 92, 96, 92, 92, 83,
-    120, 111, 101, 102,
-    102, 120, 124, 56, 120, 114, 148, 120, 108, 120, 128, 93, 99, 102, 115,
-    127, 120,
-    133, 105, 92, 69, 82, 73, 82, 101, 87, 55, 92, 92, 87, 82, 92, 92, 92, 73,
-    101, 73,
-    96, 87, 92, 114, 114, 105, 103, 101, 119, 77, 167, 41, 69, 28, 125, 114,
-    165, 133,
-    128, 137, 165, 101, 165, 101, 174, 110, 165, 101, 165, 101, 174, 119, 82,
-    92, 137,
-    102, 119, 119, 119, 73, 137, 119, 92, 83, 92, 119, 119, 128, 101, 101,
-    128, 128,
-    46, 144, 92, 92, 92, 92, 92, 92, 92, 119, 119, 119, 119, 119, 128, 128,
-    110, 42, 114,
-    114, 55, 55, 82, 126, 126, 126, 126, 132, 132, 148, 83, 101, 167, 132,
-    132, 131,
-    64, 64, 64, 64, 64, 64, 82, 82, 82, 82, 114, 64, 64, 64, 64, 64, 64, 82,
-    82, 82
-};
-static afm_cuint16 afm_Symbol_highchars_index[] = { /* 156 */
-    172, 176, 177, 181, 215, 247, 402, 913, 914, 915, 917, 918, 919, 920, 921,
-    922,
-    923, 924, 925, 926, 927, 928, 929, 931, 932, 933, 934, 935, 936, 945, 946,
-    947,
-    948, 949, 950, 951, 952, 953, 954, 955, 957, 958, 959, 960, 961, 962, 963,
-    964,
-    965, 966, 967, 968, 969, 977, 978, 981, 982, 8226, 8230, 8242, 8243, 8260,
-    8364,
-    8465, 8472, 8476, 8486, 8501, 8592, 8593, 8594, 8595, 8596, 8629, 8656,
-    8657,
-    8658, 8659, 8660, 8704, 8706, 8707, 8709, 8710, 8711, 8712, 8713, 8715,
-    8719,
-    8721, 8722, 8727, 8730, 8733, 8734, 8736, 8743, 8744, 8745, 8746, 8747,
-    8756,
-    8764, 8773, 8776, 8800, 8801, 8804, 8805, 8834, 8835, 8836, 8838, 8839,
-    8853,
-    8855, 8869, 8901, 8992, 8993, 9001, 9002, 9674, 9824, 9827, 9829, 9830,
-    63193,
-    63194, 63195, 63717, 63718, 63719, 63720, 63721, 63722, 63723, 63724,
-    63725,
-    63726, 63727, 63728, 63729, 63730, 63731, 63732, 63733, 63734, 63735,
-    63736,
-    63737, 63738, 63739, 63740, 63741, 63742
-};
-
-
-/* ------------------------------------------------------------------*/
-/* FontName: Times-Bold */
-/* FullName: Times Bold */
-/* FamilyName: Times */
-static afm_cuint8 afm_Times_Bold_widths[] = {   /* 315 */
-    42, 56, 93, 83, 83, 167, 139, 46, 56, 56, 83, 95, 42, 56, 42, 46, 83, 83,
-    83, 83, 83,
-    83, 83, 83, 83, 83, 56, 56, 95, 95, 95, 83, 155, 120, 111, 120, 120, 111,
-    102, 130,
-    130, 65, 83, 130, 111, 157, 120, 130, 102, 130, 120, 93, 111, 120, 120,
-    167, 120,
-    120, 111, 56, 46, 56, 97, 83, 56, 83, 93, 74, 93, 74, 56, 83, 93, 46, 56,
-    93, 46, 139,
-    93, 83, 93, 93, 74, 65, 56, 93, 83, 120, 83, 83, 74, 66, 37, 66, 87, 56,
-    83, 83, 83,
-    83, 37, 83, 56, 125, 50, 83, 95, 125, 56, 67, 95, 50, 50, 56, 93, 90, 42,
-    56, 50, 55,
-    83, 125, 125, 125, 83, 120, 120, 120, 120, 120, 120, 167, 120, 111, 111,
-    111, 111,
-    65, 65, 65, 65, 120, 120, 130, 130, 130, 130, 130, 95, 130, 120, 120, 120,
-    120, 120,
-    102, 93, 83, 83, 83, 83, 83, 83, 120, 74, 74, 74, 74, 74, 46, 46, 46, 46,
-    83, 93, 83,
-    83, 83, 83, 83, 95, 83, 93, 93, 93, 93, 83, 93, 83, 120, 83, 120, 83, 120,
-    83, 120,
-    74, 120, 74, 120, 112, 120, 93, 111, 74, 111, 74, 111, 74, 111, 74, 130,
-    83, 130,
-    83, 65, 46, 65, 46, 65, 46, 130, 93, 111, 46, 111, 46, 111, 66, 111, 46,
-    120, 93, 120,
-    93, 120, 93, 130, 83, 130, 83, 167, 120, 120, 74, 120, 74, 120, 74, 93,
-    65, 93, 65,
-    93, 65, 111, 56, 111, 69, 120, 93, 120, 93, 120, 93, 120, 93, 120, 111,
-    74, 111, 74,
-    111, 74, 83, 93, 65, 56, 56, 56, 56, 56, 56, 56, 56, 83, 167, 56, 56, 56,
-    83, 83, 83,
-    83, 83, 58, 167, 167, 56, 56, 28, 83, 167, 82, 102, 100, 95, 92, 92, 92,
-    92, 82, 42,
-    93, 93
-};
-static afm_sint16 afm_Times_Bold_kerning_index[] = {    /* 315 */
-    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0,
-    0, 0, 62, 183, 0, 229, 0, 266, 0, 0, 0, 359, 472, 564, 0, 599, 623, 668,
-    761, 786, 0,
-    848, 1016, 1044, 1209, 0, 1364, 0, 0, 0, 0, 0, 0, 0, 1512, 1515, 0, 1544,
-    1547, 1550,
-    1588, 1591, 1599, 0, 1602, 0, 0, 1652, 1655, 0, 0, 1660, 0, 0, 0, 1746,
-    1816, 0, 1841,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 1888, 2009, 2130, 2251, 2372, 2493, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 2614, 2638,
-    2683, 2728, 2773, 2818, 0, 2863, 2908, 2936, 2964, 2992, 3020, 0, 0, 3168,
-    3171,
-    3174, 3177, 3180, 3183, 0, 0, 3186, 3189, 3192, 3195, 3198, 3201, 3204,
-    3207,
-    0, 3210, 3213, 3218, 3223, 3228, 3233, 0, 3238, 0, 0, 0, 0, 3243, 0, 3290,
-    3337,
-    3458, 3461, 3582, 3585, 3706, 0, 0, 0, 0, 3709, 0, 3746, 3783, 0, 3786, 0,
-    3789,
-    0, 3792, 0, 3795, 0, 3798, 0, 3801, 0, 3804, 0, 3807, 0, 0, 3810, 3902,
-    3952, 0, 3987,
-    0, 0, 0, 4022, 0, 4057, 4081, 4084, 4108, 4111, 4135, 4138, 4183, 4188,
-    4233, 0,
-    0, 4238, 4300, 4386, 4448, 4534, 4596, 0, 0, 0, 0, 0, 0, 4682, 0, 4850, 0,
-    5018, 0,
-    5046, 0, 5074, 0, 5102, 0, 5130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0,
-    5278, 5306, 0, 5346, 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 afm_cuint8 afm_Times_Bold_kerning_data[] = { /* 5370 */
-    42, 19, 66, 248, 85, 252, 87, 249, 88, 252, 90, 248, 193, 248, 194, 248,
-    195, 248,
-    196, 248, 197, 248, 198, 248, 222, 248, 0, 2, 248, 0, 4, 248, 0, 6, 248,
-    0, 100, 252,
-    0, 102, 252, 0, 122, 248, 3, 1, 32, 25, 248, 1, 32, 29, 249, 3, 1, 32, 25,
-    248, 1, 32,
-    29, 248, 51, 68, 248, 72, 248, 80, 249, 82, 249, 85, 241, 86, 249, 87,
-    233, 88, 235,
-    90, 240, 113, 253, 118, 249, 119, 240, 120, 242, 122, 245, 200, 248, 211,
-    249, 212,
-    249, 213, 249, 214, 249, 215, 249, 217, 249, 218, 249, 219, 249, 220, 249,
-    221,
-    249, 222, 240, 250, 249, 251, 249, 252, 249, 253, 249, 254, 245, 0, 1,
-    245, 0, 8,
-    248, 0, 14, 248, 0, 32, 248, 0, 36, 248, 0, 78, 249, 0, 82, 249, 0, 100,
-    241, 0, 102,
-    241, 0, 108, 249, 0, 109, 249, 0, 112, 249, 0, 113, 249, 0, 114, 249, 0,
-    115, 249,
-    0, 116, 249, 0, 117, 249, 0, 122, 240, 1, 32, 25, 245, 20, 66, 252, 86,
-    255, 193, 252,
-    194, 252, 195, 252, 196, 252, 197, 252, 198, 252, 218, 255, 219, 255, 220,
-    255,
-    221, 255, 0, 2, 252, 0, 4, 252, 0, 6, 252, 0, 108, 255, 0, 112, 255, 0,
-    114, 255, 0,
-    116, 255, 17, 47, 254, 66, 251, 87, 250, 88, 250, 90, 250, 193, 251, 194,
-    251, 195,
-    251, 196, 251, 197, 251, 198, 251, 222, 250, 0, 2, 251, 0, 4, 251, 0, 6,
-    251, 0, 122,
-    250, 41, 45, 242, 47, 239, 66, 242, 98, 253, 102, 253, 112, 253, 193, 242,
-    194, 242,
-    195, 242, 196, 242, 197, 242, 198, 242, 225, 253, 226, 253, 227, 253, 228,
-    253,
-    229, 253, 230, 253, 233, 253, 234, 253, 235, 253, 236, 253, 243, 253, 244,
-    253,
-    245, 253, 246, 253, 247, 253, 249, 253, 0, 2, 242, 0, 3, 253, 0, 4, 242,
-    0, 5, 253,
-    0, 6, 242, 0, 7, 253, 0, 21, 253, 0, 25, 253, 0, 27, 253, 0, 29, 253, 0,
-    79, 253, 0, 83,
-    253, 49, 47, 254, 66, 252, 98, 254, 102, 254, 112, 254, 118, 254, 193,
-    252, 194,
-    252, 195, 252, 196, 252, 197, 252, 198, 252, 225, 254, 226, 254, 227, 254,
-    228,
-    254, 229, 254, 230, 254, 233, 254, 234, 254, 235, 254, 236, 254, 243, 254,
-    244,
-    254, 245, 254, 246, 254, 247, 254, 249, 254, 250, 254, 251, 254, 252, 254,
-    253,
-    254, 0, 2, 252, 0, 3, 254, 0, 4, 252, 0, 5, 254, 0, 6, 252, 0, 7, 254, 0,
-    21, 254, 0, 25,
-    254, 0, 27, 254, 0, 29, 254, 0, 79, 254, 0, 83, 254, 0, 109, 254, 0, 113,
-    254, 0, 115,
-    254, 0, 117, 254, 40, 80, 252, 102, 253, 112, 253, 118, 254, 122, 249,
-    211, 252,
-    212, 252, 213, 252, 214, 252, 215, 252, 217, 252, 233, 253, 234, 253, 235,
-    253,
-    236, 253, 243, 253, 244, 253, 245, 253, 246, 253, 247, 253, 249, 253, 250,
-    254,
-    251, 254, 252, 254, 253, 254, 254, 249, 0, 1, 249, 0, 21, 253, 0, 25, 253,
-    0, 27, 253,
-    0, 29, 253, 0, 78, 252, 0, 79, 253, 0, 82, 252, 0, 83, 253, 0, 109, 254,
-    0, 113, 254,
-    0, 115, 254, 0, 117, 254, 14, 85, 242, 87, 242, 88, 242, 90, 242, 122,
-    248, 222, 242,
-    254, 248, 0, 1, 248, 0, 100, 242, 0, 102, 242, 0, 122, 242, 1, 32, 25,
-    239, 1, 32, 29,
-    254, 11, 66, 254, 193, 254, 194, 254, 195, 254, 196, 254, 197, 254, 198,
-    254, 0,
-    2, 254, 0, 4, 254, 0, 6, 254, 20, 66, 250, 85, 250, 87, 249, 88, 249, 89,
-    250, 90, 249,
-    193, 250, 194, 250, 195, 250, 196, 250, 197, 250, 198, 250, 222, 249, 0,
-    2, 250,
-    0, 4, 250, 0, 6, 250, 0, 100, 250, 0, 102, 250, 0, 122, 249, 41, 45, 242,
-    47, 239, 66,
-    245, 98, 255, 102, 254, 112, 254, 193, 245, 194, 245, 195, 245, 196, 245,
-    197, 245,
-    198, 245, 225, 255, 226, 255, 227, 255, 228, 255, 229, 255, 230, 255, 233,
-    254,
-    234, 254, 235, 254, 236, 254, 243, 254, 244, 254, 245, 254, 246, 254, 247,
-    254,
-    249, 254, 0, 2, 245, 0, 3, 255, 0, 4, 245, 0, 5, 255, 0, 6, 245, 0, 7,
-    255, 0, 21, 254,
-    0, 25, 254, 0, 27, 254, 0, 29, 254, 0, 79, 254, 0, 83, 254, 11, 47, 254,
-    86, 255, 218,
-    255, 219, 255, 220, 255, 221, 255, 0, 108, 255, 0, 112, 255, 0, 114, 255,
-    0, 116,
-    255, 27, 80, 252, 85, 250, 86, 252, 87, 248, 88, 251, 90, 251, 211, 252,
-    212, 252,
-    213, 252, 214, 252, 215, 252, 217, 252, 218, 252, 219, 252, 220, 252, 221,
-    252,
-    222, 251, 0, 78, 252, 0, 82, 252, 0, 100, 250, 0, 102, 250, 0, 108, 252,
-    0, 112, 252,
-    0, 114, 252, 0, 116, 252, 0, 122, 251, 73, 45, 245, 46, 242, 47, 242, 59,
-    245, 60,
-    245, 66, 242, 80, 254, 98, 242, 102, 242, 106, 254, 112, 242, 115, 245,
-    118, 242,
-    120, 245, 122, 251, 193, 242, 194, 242, 195, 242, 196, 242, 197, 242, 198,
-    242,
-    211, 254, 212, 254, 213, 254, 214, 254, 215, 254, 217, 254, 225, 248, 226,
-    242,
-    227, 248, 228, 248, 229, 248, 230, 242, 233, 248, 234, 242, 235, 242, 236,
-    248,
-    238, 254, 243, 242, 244, 242, 245, 242, 246, 242, 247, 242, 249, 242, 250,
-    242,
-    251, 242, 252, 242, 253, 242, 254, 251, 0, 1, 251, 0, 2, 242, 0, 3, 248,
-    0, 4, 242,
-    0, 5, 248, 0, 6, 242, 0, 7, 242, 0, 21, 248, 0, 25, 242, 0, 27, 242, 0,
-    29, 242, 0, 49,
-    254, 0, 78, 254, 0, 79, 242, 0, 82, 254, 0, 83, 242, 0, 87, 245, 0, 89,
-    245, 0, 91, 245,
-    0, 109, 242, 0, 113, 242, 0, 115, 242, 0, 117, 242, 13, 45, 249, 47, 249,
-    66, 247,
-    193, 247, 194, 247, 195, 247, 196, 247, 197, 247, 198, 247, 0, 2, 247, 0,
-    4, 247,
-    0, 6, 247, 72, 45, 235, 46, 245, 47, 233, 59, 242, 60, 242, 66, 234, 72,
-    252, 80, 249,
-    98, 242, 102, 240, 106, 251, 112, 240, 118, 242, 193, 234, 194, 234, 195,
-    234, 196,
-    234, 197, 234, 198, 234, 211, 249, 212, 249, 213, 249, 214, 249, 215, 249,
-    217,
-    249, 225, 242, 226, 242, 227, 242, 228, 242, 229, 242, 230, 242, 233, 240,
-    234,
-    240, 235, 240, 236, 240, 237, 251, 238, 251, 239, 251, 240, 251, 243, 240,
-    244,
-    240, 245, 240, 246, 240, 247, 240, 249, 240, 250, 242, 251, 242, 252, 242,
-    253,
-    242, 0, 2, 234, 0, 3, 242, 0, 4, 234, 0, 5, 242, 0, 6, 234, 0, 7, 242, 0,
-    21, 240, 0, 25,
-    240, 0, 27, 240, 0, 29, 240, 0, 32, 252, 0, 36, 252, 0, 45, 251, 0, 49,
-    251, 0, 78, 249,
-    0, 79, 240, 0, 82, 249, 0, 83, 240, 0, 109, 242, 0, 113, 242, 0, 115, 242,
-    0, 117, 242,
-    68, 45, 242, 46, 251, 47, 242, 59, 248, 60, 248, 66, 237, 80, 255, 98,
-    246, 102, 246,
-    106, 254, 112, 244, 118, 249, 122, 247, 193, 237, 194, 237, 195, 237, 196,
-    237,
-    197, 237, 198, 237, 211, 255, 212, 255, 213, 255, 214, 255, 215, 255, 217,
-    255,
-    225, 246, 226, 246, 227, 246, 228, 246, 229, 246, 230, 246, 233, 246, 234,
-    246,
-    235, 246, 236, 246, 238, 254, 243, 244, 244, 244, 245, 244, 246, 244, 247,
-    244,
-    249, 244, 250, 249, 251, 249, 252, 249, 253, 249, 254, 247, 0, 1, 247, 0,
-    2, 237,
-    0, 3, 246, 0, 4, 237, 0, 5, 246, 0, 6, 237, 0, 7, 246, 0, 21, 246, 0, 25,
-    246, 0, 27, 246,
-    0, 29, 246, 0, 49, 254, 0, 78, 255, 0, 79, 244, 0, 82, 255, 0, 83, 244, 0,
-    109, 249,
-    0, 113, 249, 0, 115, 249, 0, 117, 249, 65, 45, 242, 46, 242, 47, 242, 59,
-    242, 60,
-    242, 66, 239, 80, 251, 98, 243, 102, 238, 106, 251, 112, 238, 118, 242,
-    193, 239,
-    194, 239, 195, 239, 196, 239, 197, 239, 198, 239, 211, 251, 212, 251, 213,
-    251,
-    214, 251, 215, 251, 217, 251, 225, 243, 226, 243, 227, 243, 228, 243, 229,
-    243,
-    230, 243, 233, 245, 234, 238, 235, 238, 236, 245, 238, 251, 243, 238, 244,
-    238,
-    245, 238, 246, 238, 247, 238, 249, 238, 250, 242, 251, 242, 252, 242, 253,
-    242,
-    0, 2, 239, 0, 3, 243, 0, 4, 239, 0, 5, 243, 0, 6, 239, 0, 7, 243, 0, 21,
-    245, 0, 25, 238,
-    0, 27, 238, 0, 29, 238, 0, 49, 251, 0, 78, 251, 0, 79, 238, 0, 82, 251, 0,
-    83, 238, 0,
-    109, 242, 0, 113, 242, 0, 115, 242, 0, 117, 242, 2, 119, 253, 13, 47, 250,
-    99, 255,
-    118, 254, 119, 254, 250, 254, 251, 254, 252, 254, 253, 254, 0, 109, 254,
-    0, 113,
-    254, 0, 115, 254, 0, 117, 254, 2, 120, 254, 2, 119, 254, 16, 45, 254, 47,
-    254, 106,
-    253, 112, 253, 243, 253, 244, 253, 245, 253, 246, 253, 247, 253, 249, 253,
-    0, 51,
-    251, 0, 79, 253, 0, 83, 253, 1, 32, 25, 9, 1, 32, 29, 8, 2, 47, 254, 4,
-    122, 254, 254,
-    254, 0, 1, 254, 2, 119, 255, 22, 102, 255, 112, 254, 122, 254, 233, 255,
-    234, 255,
-    235, 255, 236, 255, 243, 254, 244, 254, 245, 254, 246, 254, 247, 254, 249,
-    254,
-    254, 254, 0, 1, 254, 0, 21, 255, 0, 25, 255, 0, 27, 255, 0, 29, 255, 0,
-    79, 254, 0, 83,
-    254, 2, 119, 250, 3, 119, 255, 120, 255, 37, 45, 242, 46, 251, 47, 240,
-    100, 254,
-    102, 254, 104, 255, 111, 254, 112, 254, 113, 255, 114, 254, 119, 255, 232,
-    254,
-    233, 254, 234, 254, 235, 254, 236, 254, 242, 254, 243, 254, 244, 254, 245,
-    254,
-    246, 254, 247, 254, 249, 254, 0, 9, 254, 0, 15, 254, 0, 21, 254, 0, 25,
-    254, 0, 27,
-    254, 0, 29, 254, 0, 33, 255, 0, 37, 255, 0, 70, 254, 0, 72, 254, 0, 74,
-    254, 0, 79, 254,
-    0, 83, 254, 31, 45, 248, 47, 245, 98, 255, 102, 255, 112, 255, 225, 255,
-    226, 255,
-    227, 255, 228, 255, 229, 255, 230, 255, 233, 255, 234, 255, 235, 255, 236,
-    255,
-    243, 255, 244, 255, 245, 255, 246, 255, 247, 255, 249, 255, 0, 3, 255, 0,
-    5, 255,
-    0, 7, 255, 0, 21, 255, 0, 25, 255, 0, 27, 255, 0, 29, 255, 0, 79, 255, 0,
-    83, 255, 12,
-    45, 248, 47, 245, 112, 255, 243, 255, 244, 255, 245, 255, 246, 255, 247,
-    255, 249,
-    255, 0, 79, 255, 0, 83, 255, 21, 45, 248, 47, 245, 102, 255, 112, 253,
-    233, 255, 234,
-    255, 235, 255, 236, 255, 243, 253, 244, 253, 245, 253, 246, 253, 247, 253,
-    249,
-    253, 0, 21, 255, 0, 25, 255, 0, 27, 255, 0, 29, 255, 0, 79, 253, 0, 83,
-    253, 51, 68,
-    248, 72, 248, 80, 249, 82, 249, 85, 241, 86, 249, 87, 233, 88, 235, 90,
-    240, 113,
-    253, 118, 249, 119, 240, 120, 242, 122, 245, 200, 248, 211, 249, 212, 249,
-    213,
-    249, 214, 249, 215, 249, 217, 249, 218, 249, 219, 249, 220, 249, 221, 249,
-    222,
-    240, 250, 249, 251, 249, 252, 249, 253, 249, 254, 245, 0, 1, 245, 0, 8,
-    248, 0, 14,
-    248, 0, 32, 248, 0, 36, 248, 0, 78, 249, 0, 82, 249, 0, 100, 241, 0, 102,
-    241, 0, 108,
-    249, 0, 109, 249, 0, 112, 249, 0, 113, 249, 0, 114, 249, 0, 115, 249, 0,
-    116, 249,
-    0, 117, 249, 0, 122, 240, 1, 32, 25, 245, 51, 68, 248, 72, 248, 80, 249,
-    82, 249, 85,
-    241, 86, 249, 87, 233, 88, 235, 90, 240, 113, 253, 118, 249, 119, 240,
-    120, 242,
-    122, 245, 200, 248, 211, 249, 212, 249, 213, 249, 214, 249, 215, 249, 217,
-    249,
-    218, 249, 219, 249, 220, 249, 221, 249, 222, 240, 250, 249, 251, 249, 252,
-    249,
-    253, 249, 254, 245, 0, 1, 245, 0, 8, 248, 0, 14, 248, 0, 32, 248, 0, 36,
-    248, 0, 78,
-    249, 0, 82, 249, 0, 100, 241, 0, 102, 241, 0, 108, 249, 0, 109, 249, 0,
-    112, 249, 0,
-    113, 249, 0, 114, 249, 0, 115, 249, 0, 116, 249, 0, 117, 249, 0, 122, 240,
-    1, 32, 25,
-    245, 51, 68, 248, 72, 248, 80, 249, 82, 249, 85, 241, 86, 249, 87, 233,
-    88, 235, 90,
-    240, 113, 253, 118, 249, 119, 240, 120, 242, 122, 245, 200, 248, 211, 249,
-    212,
-    249, 213, 249, 214, 249, 215, 249, 217, 249, 218, 249, 219, 249, 220, 249,
-    221,
-    249, 222, 240, 250, 249, 251, 249, 252, 249, 253, 249, 254, 245, 0, 1,
-    245, 0, 8,
-    248, 0, 14, 248, 0, 32, 248, 0, 36, 248, 0, 78, 249, 0, 82, 249, 0, 100,
-    241, 0, 102,
-    241, 0, 108, 249, 0, 109, 249, 0, 112, 249, 0, 113, 249, 0, 114, 249, 0,
-    115, 249,
-    0, 116, 249, 0, 117, 249, 0, 122, 240, 1, 32, 25, 245, 51, 68, 248, 72,
-    248, 80, 249,
-    82, 249, 85, 241, 86, 249, 87, 233, 88, 235, 90, 240, 113, 253, 118, 249,
-    119, 240,
-    120, 242, 122, 245, 200, 248, 211, 249, 212, 249, 213, 249, 214, 249, 215,
-    249,
-    217, 249, 218, 249, 219, 249, 220, 249, 221, 249, 222, 240, 250, 249, 251,
-    249,
-    252, 249, 253, 249, 254, 245, 0, 1, 245, 0, 8, 248, 0, 14, 248, 0, 32,
-    248, 0, 36, 248,
-    0, 78, 249, 0, 82, 249, 0, 100, 241, 0, 102, 241, 0, 108, 249, 0, 109,
-    249, 0, 112,
-    249, 0, 113, 249, 0, 114, 249, 0, 115, 249, 0, 116, 249, 0, 117, 249, 0,
-    122, 240,
-    1, 32, 25, 245, 51, 68, 248, 72, 248, 80, 249, 82, 249, 85, 241, 86, 249,
-    87, 233,
-    88, 235, 90, 240, 113, 253, 118, 249, 119, 240, 120, 242, 122, 245, 200,
-    248, 211,
-    249, 212, 249, 213, 249, 214, 249, 215, 249, 217, 249, 218, 249, 219, 249,
-    220,
-    249, 221, 249, 222, 240, 250, 249, 251, 249, 252, 249, 253, 249, 254, 245,
-    0, 1,
-    245, 0, 8, 248, 0, 14, 248, 0, 32, 248, 0, 36, 248, 0, 78, 249, 0, 82,
-    249, 0, 100, 241,
-    0, 102, 241, 0, 108, 249, 0, 109, 249, 0, 112, 249, 0, 113, 249, 0, 114,
-    249, 0, 115,
-    249, 0, 116, 249, 0, 117, 249, 0, 122, 240, 1, 32, 25, 245, 51, 68, 248,
-    72, 248, 80,
-    249, 82, 249, 85, 241, 86, 249, 87, 233, 88, 235, 90, 240, 113, 253, 118,
-    249, 119,
-    240, 120, 242, 122, 245, 200, 248, 211, 249, 212, 249, 213, 249, 214, 249,
-    215,
-    249, 217, 249, 218, 249, 219, 249, 220, 249, 221, 249, 222, 240, 250, 249,
-    251,
-    249, 252, 249, 253, 249, 254, 245, 0, 1, 245, 0, 8, 248, 0, 14, 248, 0,
-    32, 248, 0,
-    36, 248, 0, 78, 249, 0, 82, 249, 0, 100, 241, 0, 102, 241, 0, 108, 249, 0,
-    109, 249,
-    0, 112, 249, 0, 113, 249, 0, 114, 249, 0, 115, 249, 0, 116, 249, 0, 117,
-    249, 0, 122,
-    240, 1, 32, 25, 245, 11, 66, 254, 193, 254, 194, 254, 195, 254, 196, 254,
-    197, 254,
-    198, 254, 0, 2, 254, 0, 4, 254, 0, 6, 254, 20, 66, 250, 85, 250, 87, 249,
-    88, 249, 89,
-    250, 90, 249, 193, 250, 194, 250, 195, 250, 196, 250, 197, 250, 198, 250,
-    222, 249,
-    0, 2, 250, 0, 4, 250, 0, 6, 250, 0, 100, 250, 0, 102, 250, 0, 122, 249,
-    20, 66, 250,
-    85, 250, 87, 249, 88, 249, 89, 250, 90, 249, 193, 250, 194, 250, 195, 250,
-    196, 250,
-    197, 250, 198, 250, 222, 249, 0, 2, 250, 0, 4, 250, 0, 6, 250, 0, 100,
-    250, 0, 102,
-    250, 0, 122, 249, 20, 66, 250, 85, 250, 87, 249, 88, 249, 89, 250, 90,
-    249, 193, 250,
-    194, 250, 195, 250, 196, 250, 197, 250, 198, 250, 222, 249, 0, 2, 250, 0,
-    4, 250,
-    0, 6, 250, 0, 100, 250, 0, 102, 250, 0, 122, 249, 20, 66, 250, 85, 250,
-    87, 249, 88,
-    249, 89, 250, 90, 249, 193, 250, 194, 250, 195, 250, 196, 250, 197, 250,
-    198, 250,
-    222, 249, 0, 2, 250, 0, 4, 250, 0, 6, 250, 0, 100, 250, 0, 102, 250, 0,
-    122, 249, 20,
-    66, 250, 85, 250, 87, 249, 88, 249, 89, 250, 90, 249, 193, 250, 194, 250,
-    195, 250,
-    196, 250, 197, 250, 198, 250, 222, 249, 0, 2, 250, 0, 4, 250, 0, 6, 250,
-    0, 100, 250,
-    0, 102, 250, 0, 122, 249, 20, 66, 250, 85, 250, 87, 249, 88, 249, 89, 250,
-    90, 249,
-    193, 250, 194, 250, 195, 250, 196, 250, 197, 250, 198, 250, 222, 249, 0,
-    2, 250,
-    0, 4, 250, 0, 6, 250, 0, 100, 250, 0, 102, 250, 0, 122, 249, 13, 45, 249,
-    47, 249, 66,
-    247, 193, 247, 194, 247, 195, 247, 196, 247, 197, 247, 198, 247, 0, 2,
-    247, 0, 4,
-    247, 0, 6, 247, 13, 45, 249, 47, 249, 66, 247, 193, 247, 194, 247, 195,
-    247, 196,
-    247, 197, 247, 198, 247, 0, 2, 247, 0, 4, 247, 0, 6, 247, 13, 45, 249, 47,
-    249, 66,
-    247, 193, 247, 194, 247, 195, 247, 196, 247, 197, 247, 198, 247, 0, 2,
-    247, 0, 4,
-    247, 0, 6, 247, 13, 45, 249, 47, 249, 66, 247, 193, 247, 194, 247, 195,
-    247, 196,
-    247, 197, 247, 198, 247, 0, 2, 247, 0, 4, 247, 0, 6, 247, 65, 45, 242, 46,
-    242, 47,
-    242, 59, 242, 60, 242, 66, 239, 80, 251, 98, 243, 102, 238, 106, 251, 112,
-    238, 118,
-    242, 193, 239, 194, 239, 195, 239, 196, 239, 197, 239, 198, 239, 211, 251,
-    212,
-    251, 213, 251, 214, 251, 215, 251, 217, 251, 225, 243, 226, 243, 227, 243,
-    228,
-    243, 229, 243, 230, 243, 233, 245, 234, 238, 235, 238, 236, 245, 238, 251,
-    243,
-    238, 244, 238, 245, 238, 246, 238, 247, 238, 249, 238, 250, 242, 251, 242,
-    252,
-    242, 253, 242, 0, 2, 239, 0, 3, 243, 0, 4, 239, 0, 5, 243, 0, 6, 239, 0,
-    7, 243, 0, 21,
-    245, 0, 25, 238, 0, 27, 238, 0, 29, 238, 0, 49, 251, 0, 78, 251, 0, 79,
-    238, 0, 82, 251,
-    0, 83, 238, 0, 109, 242, 0, 113, 242, 0, 115, 242, 0, 117, 242, 2, 119,
-    253, 2, 119,
-    253, 2, 119, 253, 2, 119, 253, 2, 119, 253, 2, 119, 253, 2, 119, 254, 2,
-    119, 254,
-    2, 119, 254, 2, 119, 254, 2, 119, 255, 2, 119, 255, 2, 119, 255, 2, 119,
-    255, 2, 119,
-    250, 3, 119, 255, 120, 255, 3, 119, 255, 120, 255, 3, 119, 255, 120, 255,
-    3, 119,
-    255, 120, 255, 3, 119, 255, 120, 255, 3, 119, 255, 120, 255, 21, 45, 248,
-    47, 245,
-    102, 255, 112, 253, 233, 255, 234, 255, 235, 255, 236, 255, 243, 253, 244,
-    253,
-    245, 253, 246, 253, 247, 253, 249, 253, 0, 21, 255, 0, 25, 255, 0, 27,
-    255, 0, 29,
-    255, 0, 79, 253, 0, 83, 253, 21, 45, 248, 47, 245, 102, 255, 112, 253,
-    233, 255, 234,
-    255, 235, 255, 236, 255, 243, 253, 244, 253, 245, 253, 246, 253, 247, 253,
-    249,
-    253, 0, 21, 255, 0, 25, 255, 0, 27, 255, 0, 29, 255, 0, 79, 253, 0, 83,
-    253, 51, 68,
-    248, 72, 248, 80, 249, 82, 249, 85, 241, 86, 249, 87, 233, 88, 235, 90,
-    240, 113,
-    253, 118, 249, 119, 240, 120, 242, 122, 245, 200, 248, 211, 249, 212, 249,
-    213,
-    249, 214, 249, 215, 249, 217, 249, 218, 249, 219, 249, 220, 249, 221, 249,
-    222,
-    240, 250, 249, 251, 249, 252, 249, 253, 249, 254, 245, 0, 1, 245, 0, 8,
-    248, 0, 14,
-    248, 0, 32, 248, 0, 36, 248, 0, 78, 249, 0, 82, 249, 0, 100, 241, 0, 102,
-    241, 0, 108,
-    249, 0, 109, 249, 0, 112, 249, 0, 113, 249, 0, 114, 249, 0, 115, 249, 0,
-    116, 249,
-    0, 117, 249, 0, 122, 240, 1, 32, 25, 245, 2, 119, 253, 51, 68, 248, 72,
-    248, 80, 249,
-    82, 249, 85, 241, 86, 249, 87, 233, 88, 235, 90, 240, 113, 253, 118, 249,
-    119, 240,
-    120, 242, 122, 245, 200, 248, 211, 249, 212, 249, 213, 249, 214, 249, 215,
-    249,
-    217, 249, 218, 249, 219, 249, 220, 249, 221, 249, 222, 240, 250, 249, 251,
-    249,
-    252, 249, 253, 249, 254, 245, 0, 1, 245, 0, 8, 248, 0, 14, 248, 0, 32,
-    248, 0, 36, 248,
-    0, 78, 249, 0, 82, 249, 0, 100, 241, 0, 102, 241, 0, 108, 249, 0, 109,
-    249, 0, 112,
-    249, 0, 113, 249, 0, 114, 249, 0, 115, 249, 0, 116, 249, 0, 117, 249, 0,
-    122, 240,
-    1, 32, 25, 245, 2, 119, 253, 51, 68, 248, 72, 248, 80, 249, 82, 249, 85,
-    241, 86, 249,
-    87, 233, 88, 235, 90, 240, 113, 253, 118, 249, 119, 240, 120, 242, 122,
-    251, 200,
-    248, 211, 249, 212, 249, 213, 249, 214, 249, 215, 249, 217, 249, 218, 249,
-    219,
-    249, 220, 249, 221, 249, 222, 240, 250, 249, 251, 249, 252, 249, 253, 249,
-    254,
-    251, 0, 1, 251, 0, 8, 248, 0, 14, 248, 0, 32, 248, 0, 36, 248, 0, 78, 249,
-    0, 82, 249,
-    0, 100, 241, 0, 102, 241, 0, 108, 249, 0, 109, 249, 0, 112, 249, 0, 113,
-    249, 0, 114,
-    249, 0, 115, 249, 0, 116, 249, 0, 117, 249, 0, 122, 240, 1, 32, 25, 245,
-    2, 119, 253,
-    17, 47, 254, 66, 251, 87, 250, 88, 250, 90, 250, 193, 251, 194, 251, 195,
-    251, 196,
-    251, 197, 251, 198, 251, 222, 250, 0, 2, 251, 0, 4, 251, 0, 6, 251, 0,
-    122, 250, 17,
-    47, 254, 66, 251, 87, 250, 88, 250, 90, 250, 193, 251, 194, 251, 195, 251,
-    196, 251,
-    197, 251, 198, 251, 222, 250, 0, 2, 251, 0, 4, 251, 0, 6, 251, 0, 122,
-    250, 2, 120,
-    254, 2, 119, 254, 2, 119, 254, 2, 119, 254, 2, 119, 254, 2, 47, 254, 2,
-    47, 254, 2,
-    119, 255, 2, 119, 255, 40, 80, 252, 102, 253, 112, 253, 118, 254, 122,
-    249, 211,
-    252, 212, 252, 213, 252, 214, 252, 215, 252, 217, 252, 233, 253, 234, 253,
-    235,
-    253, 236, 253, 243, 253, 244, 253, 245, 253, 246, 253, 247, 253, 249, 253,
-    250,
-    254, 251, 254, 252, 254, 253, 254, 254, 249, 0, 1, 249, 0, 21, 253, 0, 25,
-    253, 0,
-    27, 253, 0, 29, 253, 0, 78, 252, 0, 79, 253, 0, 82, 252, 0, 83, 253, 0,
-    109, 254, 0,
-    113, 254, 0, 115, 254, 0, 117, 254, 22, 102, 255, 112, 254, 122, 254, 233,
-    255, 234,
-    255, 235, 255, 236, 255, 243, 254, 244, 254, 245, 254, 246, 254, 247, 254,
-    249,
-    254, 254, 254, 0, 1, 254, 0, 21, 255, 0, 25, 255, 0, 27, 255, 0, 29, 255,
-    0, 79, 254,
-    0, 83, 254, 14, 85, 242, 87, 242, 88, 242, 90, 242, 122, 248, 222, 242,
-    254, 248,
-    0, 1, 248, 0, 100, 242, 0, 102, 242, 0, 122, 242, 1, 32, 25, 239, 1, 32,
-    29, 254, 14,
-    85, 242, 87, 242, 88, 242, 90, 242, 122, 248, 222, 242, 254, 248, 0, 1,
-    248, 0, 100,
-    242, 0, 102, 242, 0, 122, 242, 1, 32, 25, 239, 1, 32, 29, 254, 14, 85,
-    242, 87, 242,
-    88, 242, 90, 242, 122, 248, 222, 242, 254, 248, 0, 1, 248, 0, 100, 242, 0,
-    102, 242,
-    0, 122, 242, 1, 32, 25, 239, 1, 32, 29, 254, 11, 66, 254, 193, 254, 194,
-    254, 195,
-    254, 196, 254, 197, 254, 198, 254, 0, 2, 254, 0, 4, 254, 0, 6, 254, 2,
-    119, 250, 11,
-    66, 254, 193, 254, 194, 254, 195, 254, 196, 254, 197, 254, 198, 254, 0, 2,
-    254, 0,
-    4, 254, 0, 6, 254, 2, 119, 250, 11, 66, 254, 193, 254, 194, 254, 195, 254,
-    196, 254,
-    197, 254, 198, 254, 0, 2, 254, 0, 4, 254, 0, 6, 254, 2, 119, 250, 20, 66,
-    250, 85, 250,
-    87, 249, 88, 249, 89, 250, 90, 249, 193, 250, 194, 250, 195, 250, 196,
-    250, 197,
-    250, 198, 250, 222, 249, 0, 2, 250, 0, 4, 250, 0, 6, 250, 0, 100, 250, 0,
-    102, 250,
-    0, 122, 249, 3, 119, 255, 120, 255, 20, 66, 250, 85, 250, 87, 249, 88,
-    249, 89, 250,
-    90, 249, 193, 250, 194, 250, 195, 250, 196, 250, 197, 250, 198, 250, 222,
-    249, 0,
-    2, 250, 0, 4, 250, 0, 6, 250, 0, 100, 250, 0, 102, 250, 0, 122, 249, 3,
-    119, 255, 120,
-    255, 27, 80, 252, 85, 250, 86, 252, 87, 248, 88, 251, 90, 251, 211, 252,
-    212, 252,
-    213, 252, 214, 252, 215, 252, 217, 252, 218, 252, 219, 252, 220, 252, 221,
-    252,
-    222, 251, 0, 78, 252, 0, 82, 252, 0, 100, 250, 0, 102, 250, 0, 108, 252,
-    0, 112, 252,
-    0, 114, 252, 0, 116, 252, 0, 122, 251, 37, 45, 242, 46, 251, 47, 240, 100,
-    254, 102,
-    254, 104, 255, 111, 254, 112, 254, 113, 255, 114, 254, 119, 255, 232, 254,
-    233,
-    254, 234, 254, 235, 254, 236, 254, 242, 254, 243, 254, 244, 254, 245, 254,
-    246,
-    254, 247, 254, 249, 254, 0, 9, 254, 0, 15, 254, 0, 21, 254, 0, 25, 254, 0,
-    27, 254,
-    0, 29, 254, 0, 33, 255, 0, 37, 255, 0, 70, 254, 0, 72, 254, 0, 74, 254, 0,
-    79, 254, 0,
-    83, 254, 27, 80, 252, 85, 250, 86, 252, 87, 248, 88, 251, 90, 251, 211,
-    252, 212,
-    252, 213, 252, 214, 252, 215, 252, 217, 252, 218, 252, 219, 252, 220, 252,
-    221,
-    252, 222, 251, 0, 78, 252, 0, 82, 252, 0, 100, 250, 0, 102, 250, 0, 108,
-    252, 0, 112,
-    252, 0, 114, 252, 0, 116, 252, 0, 122, 251, 37, 45, 242, 46, 251, 47, 240,
-    100, 254,
-    102, 254, 104, 255, 111, 254, 112, 254, 113, 255, 114, 254, 119, 255, 232,
-    254,
-    233, 254, 234, 254, 235, 254, 236, 254, 242, 254, 243, 254, 244, 254, 245,
-    254,
-    246, 254, 247, 254, 249, 254, 0, 9, 254, 0, 15, 254, 0, 21, 254, 0, 25,
-    254, 0, 27,
-    254, 0, 29, 254, 0, 33, 255, 0, 37, 255, 0, 70, 254, 0, 72, 254, 0, 74,
-    254, 0, 79, 254,
-    0, 83, 254, 27, 80, 252, 85, 250, 86, 252, 87, 248, 88, 251, 90, 251, 211,
-    252, 212,
-    252, 213, 252, 214, 252, 215, 252, 217, 252, 218, 252, 219, 252, 220, 252,
-    221,
-    252, 222, 251, 0, 78, 252, 0, 82, 252, 0, 100, 250, 0, 102, 250, 0, 108,
-    252, 0, 112,
-    252, 0, 114, 252, 0, 116, 252, 0, 122, 251, 37, 45, 242, 46, 251, 47, 240,
-    100, 254,
-    102, 254, 104, 255, 111, 254, 112, 254, 113, 255, 114, 254, 119, 255, 232,
-    254,
-    233, 254, 234, 254, 235, 254, 236, 254, 242, 254, 243, 254, 244, 254, 245,
-    254,
-    246, 254, 247, 254, 249, 254, 0, 9, 254, 0, 15, 254, 0, 21, 254, 0, 25,
-    254, 0, 27,
-    254, 0, 29, 254, 0, 33, 255, 0, 37, 255, 0, 70, 254, 0, 72, 254, 0, 74,
-    254, 0, 79, 254,
-    0, 83, 254, 73, 45, 245, 46, 242, 47, 242, 59, 245, 60, 245, 66, 242, 80,
-    254, 98,
-    242, 102, 242, 106, 254, 112, 242, 115, 245, 118, 242, 120, 245, 122, 251,
-    193,
-    242, 194, 242, 195, 242, 196, 242, 197, 242, 198, 242, 211, 254, 212, 254,
-    213,
-    254, 214, 254, 215, 254, 217, 254, 225, 248, 226, 242, 227, 248, 228, 248,
-    229,
-    248, 230, 242, 233, 248, 234, 242, 235, 242, 236, 248, 238, 254, 243, 242,
-    244,
-    242, 245, 242, 246, 242, 247, 242, 249, 242, 250, 242, 251, 242, 252, 242,
-    253,
-    242, 254, 251, 0, 1, 251, 0, 2, 242, 0, 3, 248, 0, 4, 242, 0, 5, 248, 0,
-    6, 242, 0, 7,
-    242, 0, 21, 248, 0, 25, 242, 0, 27, 242, 0, 29, 242, 0, 49, 254, 0, 78,
-    254, 0, 79, 242,
-    0, 82, 254, 0, 83, 242, 0, 87, 245, 0, 89, 245, 0, 91, 245, 0, 109, 242,
-    0, 113, 242,
-    0, 115, 242, 0, 117, 242, 73, 45, 245, 46, 242, 47, 242, 59, 245, 60, 245,
-    66, 242,
-    80, 254, 98, 242, 102, 242, 106, 254, 112, 242, 115, 245, 118, 242, 120,
-    245, 122,
-    251, 193, 242, 194, 242, 195, 242, 196, 242, 197, 242, 198, 242, 211, 254,
-    212,
-    254, 213, 254, 214, 254, 215, 254, 217, 254, 225, 248, 226, 242, 227, 248,
-    228,
-    248, 229, 248, 230, 242, 233, 248, 234, 242, 235, 242, 236, 248, 238, 254,
-    243,
-    242, 244, 242, 245, 242, 246, 242, 247, 242, 249, 242, 250, 242, 251, 242,
-    252,
-    242, 253, 242, 254, 251, 0, 1, 251, 0, 2, 242, 0, 3, 248, 0, 4, 242, 0, 5,
-    248, 0, 6,
-    242, 0, 7, 242, 0, 21, 248, 0, 25, 242, 0, 27, 242, 0, 29, 242, 0, 49,
-    254, 0, 78, 254,
-    0, 79, 242, 0, 82, 254, 0, 83, 242, 0, 87, 245, 0, 89, 245, 0, 91, 245, 0,
-    109, 242,
-    0, 113, 242, 0, 115, 242, 0, 117, 242, 13, 45, 249, 47, 249, 66, 247, 193,
-    247, 194,
-    247, 195, 247, 196, 247, 197, 247, 198, 247, 0, 2, 247, 0, 4, 247, 0, 6,
-    247, 13, 45,
-    249, 47, 249, 66, 247, 193, 247, 194, 247, 195, 247, 196, 247, 197, 247,
-    198, 247,
-    0, 2, 247, 0, 4, 247, 0, 6, 247, 13, 45, 249, 47, 249, 66, 247, 193, 247,
-    194, 247,
-    195, 247, 196, 247, 197, 247, 198, 247, 0, 2, 247, 0, 4, 247, 0, 6, 247,
-    13, 45, 249,
-    47, 249, 66, 247, 193, 247, 194, 247, 195, 247, 196, 247, 197, 247, 198,
-    247, 0,
-    2, 247, 0, 4, 247, 0, 6, 247, 65, 45, 242, 46, 242, 47, 242, 59, 242, 60,
-    242, 66, 239,
-    80, 251, 98, 243, 102, 238, 106, 251, 112, 238, 118, 242, 193, 239, 194,
-    239, 195,
-    239, 196, 239, 197, 239, 198, 239, 211, 251, 212, 251, 213, 251, 214, 251,
-    215,
-    251, 217, 251, 225, 243, 226, 243, 227, 243, 228, 243, 229, 243, 230, 243,
-    233,
-    245, 234, 238, 235, 238, 236, 245, 238, 251, 243, 238, 244, 238, 245, 238,
-    246,
-    238, 247, 238, 249, 238, 250, 242, 251, 242, 252, 242, 253, 242, 0, 2,
-    239, 0, 3,
-    243, 0, 4, 239, 0, 5, 243, 0, 6, 239, 0, 7, 243, 0, 21, 245, 0, 25, 238,
-    0, 27, 238, 0,
-    29, 238, 0, 49, 251, 0, 78, 251, 0, 79, 238, 0, 82, 251, 0, 83, 238, 0,
-    109, 242, 0,
-    113, 242, 0, 115, 242, 0, 117, 242, 12, 66, 255, 193, 255, 194, 255, 195,
-    255, 196,
-    255, 197, 255, 198, 255, 0, 2, 255, 0, 4, 255, 0, 6, 255, 1, 32, 24, 246,
-    15, 33, 245,
-    101, 254, 115, 254, 116, 251, 119, 254, 0, 19, 254, 0, 87, 254, 0, 89,
-    254, 0, 91,
-    254, 0, 93, 251, 0, 97, 251, 0, 99, 251, 1, 2, 25, 251, 1, 32, 25, 246,
-    11, 66, 255,
-    193, 255, 194, 255, 195, 255, 196, 255, 197, 255, 198, 255, 0, 2, 255, 0,
-    4, 255,
-    0, 6, 255
-};
-static afm_cuint16 afm_Times_Bold_highchars_index[] = { /* 220 */
-    161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176,
-    177,
-    178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192,
-    193,
-    194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208,
-    209,
-    210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224,
-    225,
-    226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240,
-    241,
-    242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256,
-    257,
-    258, 259, 260, 261, 262, 263, 268, 269, 270, 271, 272, 273, 274, 275, 278,
-    279,
-    280, 281, 282, 283, 286, 287, 290, 291, 298, 299, 302, 303, 304, 305, 310,
-    311,
-    313, 314, 315, 316, 317, 318, 321, 322, 323, 324, 325, 326, 327, 328, 332,
-    333,
-    336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 350, 351, 352,
-    353,
-    354, 355, 356, 357, 362, 363, 366, 367, 368, 369, 370, 371, 376, 377, 378,
-    379,
-    380, 381, 382, 402, 536, 537, 710, 711, 728, 729, 730, 731, 732, 733,
-    8211, 8212,
-    8216, 8217, 8218, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8249,
-    8250,
-    8260, 8364, 8482, 8706, 8710, 8721, 8722, 8730, 8800, 8804, 8805, 9674,
-    63171,
-    64257, 64258
-};
-static afm_cunicode afm_Times_Bold_ligatures[] = {  /* 3 */
-    102, 105, 64257
-};
-
-
-/* ------------------------------------------------------------------*/
-/* FontName: Times-BoldItalic */
-/* FullName: Times Bold Italic */
-/* FamilyName: Times */
-static afm_cuint8 afm_Times_BoldItalic_widths[] = { /* 315 */
-    42, 65, 93, 83, 83, 139, 130, 46, 56, 56, 83, 95, 42, 56, 42, 46, 83, 83,
-    83, 83, 83,
-    83, 83, 83, 83, 83, 56, 56, 95, 95, 95, 83, 139, 111, 111, 111, 120, 111,
-    111, 120,
-    130, 65, 83, 111, 102, 148, 120, 120, 102, 120, 111, 93, 102, 120, 111,
-    148, 111,
-    102, 102, 56, 46, 56, 95, 83, 56, 83, 83, 74, 83, 74, 56, 83, 93, 46, 46,
-    83, 46, 130,
-    93, 83, 83, 83, 65, 65, 46, 93, 74, 111, 83, 74, 65, 58, 37, 58, 95, 65,
-    83, 83, 83,
-    83, 37, 83, 56, 125, 44, 83, 101, 125, 56, 67, 95, 50, 50, 56, 96, 83, 42,
-    56, 50, 50,
-    83, 125, 125, 125, 83, 111, 111, 111, 111, 111, 111, 157, 111, 111, 111,
-    111, 111,
-    65, 65, 65, 65, 120, 120, 120, 120, 120, 120, 120, 95, 120, 120, 120, 120,
-    120, 102,
-    102, 83, 83, 83, 83, 83, 83, 83, 120, 74, 74, 74, 74, 74, 46, 46, 46, 46,
-    83, 93, 83,
-    83, 83, 83, 83, 95, 83, 93, 93, 93, 93, 74, 83, 74, 111, 83, 111, 83, 111,
-    83, 111,
-    74, 111, 74, 120, 101, 120, 83, 111, 74, 111, 74, 111, 74, 111, 74, 120,
-    83, 120,
-    83, 65, 46, 65, 46, 65, 46, 111, 83, 102, 46, 102, 46, 102, 64, 102, 46,
-    120, 93, 120,
-    93, 120, 93, 120, 83, 120, 83, 157, 120, 111, 65, 111, 65, 111, 65, 93,
-    65, 93, 65,
-    93, 65, 102, 46, 102, 61, 120, 93, 120, 93, 120, 93, 120, 93, 102, 102,
-    65, 102, 65,
-    102, 65, 83, 93, 65, 56, 56, 56, 56, 56, 56, 56, 56, 83, 167, 56, 56, 56,
-    83, 83, 83,
-    83, 83, 58, 167, 167, 56, 56, 28, 83, 167, 82, 102, 100, 101, 92, 92, 92,
-    92, 82, 42,
-    93, 93
-};
-static afm_sint16 afm_Times_BoldItalic_kerning_index[] = {  /* 315 */
-    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0,
-    0, 0, 54, 173, 0, 219, 0, 254, 0, 0, 0, 374, 489, 581, 0, 612, 636, 681,
-    774, 797, 0,
-    859, 1027, 1051, 1207, 0, 1362, 0, 0, 0, 0, 0, 0, 0, 0, 1510, 1537, 0,
-    1545, 1548,
-    0, 0, 0, 0, 1587, 0, 0, 1630, 1633, 0, 0, 1647, 0, 0, 0, 1652, 1699, 1769,
-    1792, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0,
-    0, 0, 1797, 1916, 2035, 2154, 2273, 2392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    2511, 2535,
-    2580, 2625, 2670, 2715, 0, 2760, 2805, 2829, 2853, 2877, 2901, 0, 0, 0, 0,
-    0, 0,
-    0, 0, 0, 3049, 3057, 3060, 3063, 3066, 0, 0, 0, 0, 0, 3069, 3072, 3086,
-    3100, 3114,
-    3128, 0, 3142, 0, 0, 0, 0, 3156, 0, 3161, 3166, 0, 3285, 0, 3404, 0, 0,
-    3523, 0, 3531,
-    3539, 0, 3574, 0, 0, 3609, 0, 3612, 0, 3615, 0, 3618, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 3621,
-    3713, 3756, 0, 3787, 0, 0, 0, 3818, 0, 3849, 3873, 3876, 3900, 3903, 3927,
-    3930,
-    3975, 3989, 4034, 0, 0, 4048, 4110, 4115, 4177, 4182, 4244, 0, 0, 0, 0, 0,
-    0, 4249,
-    0, 4417, 0, 4585, 0, 4609, 0, 4633, 0, 4657, 0, 4681, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 4829, 4834, 0, 0, 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 afm_cuint8 afm_Times_BoldItalic_kerning_data[] = {   /* 4879 */
-    42, 16, 66, 251, 87, 245, 88, 245, 90, 245, 193, 251, 194, 251, 195, 251,
-    196, 251,
-    197, 251, 198, 251, 222, 245, 0, 2, 251, 0, 4, 251, 0, 6, 251, 0, 122,
-    245, 3, 1, 32,
-    25, 241, 1, 32, 29, 241, 3, 1, 32, 25, 241, 1, 32, 29, 241, 50, 68, 246,
-    72, 247, 80,
-    249, 82, 248, 85, 248, 86, 249, 87, 241, 88, 240, 90, 245, 118, 252, 119,
-    245, 120,
-    245, 122, 245, 200, 246, 211, 249, 212, 249, 213, 249, 214, 249, 215, 249,
-    217,
-    249, 218, 249, 219, 249, 220, 249, 221, 249, 222, 245, 250, 252, 251, 252,
-    252,
-    252, 253, 252, 254, 245, 0, 1, 245, 0, 8, 246, 0, 14, 246, 0, 32, 247, 0,
-    36, 247, 0,
-    78, 249, 0, 82, 249, 0, 100, 248, 0, 102, 248, 0, 108, 249, 0, 109, 252,
-    0, 112, 249,
-    0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116, 249, 0, 117, 252, 0, 122,
-    245, 1, 32,
-    25, 245, 20, 66, 253, 86, 255, 193, 253, 194, 253, 195, 253, 196, 253,
-    197, 253,
-    198, 253, 218, 255, 219, 255, 220, 255, 221, 255, 0, 2, 253, 0, 4, 253, 0,
-    6, 253,
-    0, 108, 255, 0, 112, 255, 0, 114, 255, 0, 116, 255, 16, 66, 253, 87, 249,
-    88, 250,
-    90, 249, 193, 253, 194, 253, 195, 253, 196, 253, 197, 253, 198, 253, 222,
-    249, 0,
-    2, 253, 0, 4, 253, 0, 6, 253, 0, 122, 249, 52, 45, 235, 47, 235, 66, 240,
-    98, 241, 102,
-    240, 106, 250, 112, 245, 115, 249, 193, 240, 194, 240, 195, 240, 196, 240,
-    197,
-    240, 198, 240, 225, 241, 226, 241, 227, 241, 228, 241, 229, 241, 230, 241,
-    233,
-    240, 234, 240, 235, 240, 236, 240, 237, 250, 238, 250, 239, 250, 240, 250,
-    243,
-    245, 244, 245, 245, 245, 246, 245, 247, 245, 249, 245, 0, 2, 240, 0, 3,
-    241, 0, 4,
-    240, 0, 5, 241, 0, 6, 240, 0, 7, 241, 0, 21, 240, 0, 25, 240, 0, 27, 240,
-    0, 29, 240,
-    0, 45, 250, 0, 49, 250, 0, 79, 245, 0, 83, 245, 0, 87, 249, 0, 89, 249, 0,
-    91, 249, 50,
-    45, 255, 47, 255, 66, 253, 98, 250, 102, 250, 112, 250, 118, 250, 193,
-    253, 194,
-    253, 195, 253, 196, 253, 197, 253, 198, 253, 225, 250, 226, 250, 227, 250,
-    228,
-    250, 229, 250, 230, 250, 233, 250, 234, 250, 235, 250, 236, 250, 243, 250,
-    244,
-    250, 245, 250, 246, 250, 247, 250, 249, 250, 250, 250, 251, 250, 252, 250,
-    253,
-    250, 0, 2, 253, 0, 3, 250, 0, 4, 253, 0, 5, 250, 0, 6, 253, 0, 7, 250, 0,
-    21, 250, 0, 25,
-    250, 0, 27, 250, 0, 29, 250, 0, 79, 250, 0, 83, 250, 0, 109, 250, 0, 113,
-    250, 0, 115,
-    250, 0, 117, 250, 40, 80, 252, 102, 253, 112, 253, 118, 254, 122, 254,
-    211, 252,
-    212, 252, 213, 252, 214, 252, 215, 252, 217, 252, 233, 253, 234, 253, 235,
-    253,
-    236, 253, 243, 253, 244, 253, 245, 253, 246, 253, 247, 253, 249, 253, 250,
-    254,
-    251, 254, 252, 254, 253, 254, 254, 254, 0, 1, 254, 0, 21, 253, 0, 25, 253,
-    0, 27, 253,
-    0, 29, 253, 0, 78, 252, 0, 79, 253, 0, 82, 252, 0, 83, 253, 0, 109, 254,
-    0, 113, 254,
-    0, 115, 254, 0, 117, 254, 13, 85, 254, 87, 251, 88, 251, 90, 251, 122,
-    251, 222, 251,
-    254, 251, 0, 1, 251, 0, 100, 254, 0, 102, 254, 0, 122, 251, 1, 32, 25,
-    248, 11, 66,
-    252, 193, 252, 194, 252, 195, 252, 196, 252, 197, 252, 198, 252, 0, 2,
-    252, 0, 4,
-    252, 0, 6, 252, 20, 66, 250, 85, 250, 87, 249, 88, 249, 89, 250, 90, 249,
-    193, 250,
-    194, 250, 195, 250, 196, 250, 197, 250, 198, 250, 222, 249, 0, 2, 250, 0,
-    4, 250,
-    0, 6, 250, 0, 100, 250, 0, 102, 250, 0, 122, 249, 41, 45, 235, 47, 235,
-    66, 243, 98,
-    250, 102, 249, 112, 248, 193, 243, 194, 243, 195, 243, 196, 243, 197, 243,
-    198,
-    243, 225, 250, 226, 250, 227, 250, 228, 250, 229, 250, 230, 250, 233, 249,
-    234,
-    249, 235, 249, 236, 249, 243, 248, 244, 248, 245, 248, 246, 248, 247, 248,
-    249,
-    248, 0, 2, 243, 0, 3, 250, 0, 4, 243, 0, 5, 250, 0, 6, 243, 0, 7, 250, 0,
-    21, 249, 0, 25,
-    249, 0, 27, 249, 0, 29, 249, 0, 79, 248, 0, 83, 248, 10, 86, 255, 218,
-    255, 219, 255,
-    220, 255, 221, 255, 0, 108, 255, 0, 112, 255, 0, 114, 255, 0, 116, 255,
-    27, 80, 250,
-    85, 252, 86, 250, 87, 254, 88, 254, 90, 254, 211, 250, 212, 250, 213, 250,
-    214, 250,
-    215, 250, 217, 250, 218, 250, 219, 250, 220, 250, 221, 250, 222, 254, 0,
-    78, 250,
-    0, 82, 250, 0, 100, 252, 0, 102, 252, 0, 108, 250, 0, 112, 250, 0, 114,
-    250, 0, 116,
-    250, 0, 122, 254, 73, 45, 242, 46, 242, 47, 242, 59, 245, 60, 245, 66,
-    248, 80, 254,
-    98, 242, 102, 242, 106, 251, 112, 241, 115, 251, 118, 251, 120, 251, 122,
-    251, 193,
-    248, 194, 248, 195, 248, 196, 248, 197, 248, 198, 248, 211, 254, 212, 254,
-    213,
-    254, 214, 254, 215, 254, 217, 254, 225, 242, 226, 242, 227, 242, 228, 242,
-    229,
-    242, 230, 242, 233, 248, 234, 242, 235, 242, 236, 248, 238, 251, 243, 241,
-    244,
-    241, 245, 241, 246, 241, 247, 241, 249, 241, 250, 251, 251, 251, 252, 251,
-    253,
-    251, 254, 251, 0, 1, 251, 0, 2, 248, 0, 3, 242, 0, 4, 248, 0, 5, 242, 0,
-    6, 248, 0, 7,
-    242, 0, 21, 248, 0, 25, 242, 0, 27, 242, 0, 29, 242, 0, 49, 251, 0, 78,
-    254, 0, 79, 241,
-    0, 82, 254, 0, 83, 241, 0, 87, 251, 0, 89, 251, 0, 91, 251, 0, 109, 251,
-    0, 113, 251,
-    0, 115, 251, 0, 117, 251, 11, 66, 249, 193, 249, 194, 249, 195, 249, 196,
-    249, 197,
-    249, 198, 249, 0, 2, 249, 0, 4, 249, 0, 6, 249, 68, 45, 235, 46, 245, 47,
-    235, 59, 245,
-    60, 245, 66, 243, 72, 255, 80, 252, 98, 238, 102, 238, 106, 248, 112, 238,
-    118, 248,
-    193, 243, 194, 243, 195, 243, 196, 243, 197, 243, 198, 243, 211, 252, 212,
-    252,
-    213, 252, 214, 252, 215, 252, 217, 252, 225, 238, 226, 238, 227, 238, 228,
-    238,
-    229, 238, 230, 238, 233, 245, 234, 238, 235, 238, 236, 245, 238, 248, 243,
-    238,
-    244, 238, 245, 238, 246, 238, 247, 238, 249, 238, 250, 248, 251, 248, 252,
-    248,
-    253, 248, 0, 2, 243, 0, 3, 238, 0, 4, 243, 0, 5, 238, 0, 6, 243, 0, 7,
-    238, 0, 21, 245,
-    0, 25, 238, 0, 27, 238, 0, 29, 238, 0, 32, 255, 0, 36, 255, 0, 49, 248, 0,
-    78, 252, 0,
-    79, 238, 0, 82, 252, 0, 83, 238, 0, 109, 248, 0, 113, 248, 0, 115, 248, 0,
-    117, 248,
-    68, 45, 245, 46, 249, 47, 245, 59, 248, 60, 248, 66, 245, 80, 254, 98,
-    243, 102, 242,
-    106, 251, 112, 244, 118, 248, 122, 248, 193, 245, 194, 245, 195, 245, 196,
-    245,
-    197, 245, 198, 245, 211, 254, 212, 254, 213, 254, 214, 254, 215, 254, 217,
-    254,
-    225, 243, 226, 243, 227, 243, 228, 243, 229, 243, 230, 243, 233, 249, 234,
-    242,
-    235, 242, 236, 249, 238, 251, 243, 244, 244, 244, 245, 244, 246, 244, 247,
-    244,
-    249, 244, 250, 248, 251, 248, 252, 248, 253, 248, 254, 248, 0, 1, 248, 0,
-    2, 245,
-    0, 3, 243, 0, 4, 245, 0, 5, 243, 0, 6, 245, 0, 7, 243, 0, 21, 249, 0, 25,
-    242, 0, 27, 242,
-    0, 29, 242, 0, 49, 251, 0, 78, 254, 0, 79, 244, 0, 82, 254, 0, 83, 244, 0,
-    109, 248,
-    0, 113, 248, 0, 115, 248, 0, 117, 248, 65, 45, 242, 46, 242, 47, 245, 59,
-    242, 60,
-    242, 66, 245, 80, 253, 98, 242, 102, 238, 106, 248, 112, 238, 118, 242,
-    193, 245,
-    194, 245, 195, 245, 196, 245, 197, 245, 198, 245, 211, 253, 212, 253, 213,
-    253,
-    214, 253, 215, 253, 217, 253, 225, 242, 226, 242, 227, 242, 228, 242, 229,
-    242,
-    230, 242, 233, 245, 234, 238, 235, 245, 236, 245, 238, 248, 243, 238, 244,
-    238,
-    245, 238, 246, 238, 247, 238, 249, 238, 250, 242, 251, 242, 252, 242, 253,
-    242,
-    0, 2, 245, 0, 3, 242, 0, 4, 245, 0, 5, 242, 0, 6, 245, 0, 7, 242, 0, 21,
-    245, 0, 25, 238,
-    0, 27, 238, 0, 29, 238, 0, 49, 248, 0, 78, 253, 0, 79, 238, 0, 82, 253, 0,
-    83, 238, 0,
-    109, 242, 0, 113, 242, 0, 115, 242, 0, 117, 242, 12, 47, 250, 99, 255,
-    118, 254, 250,
-    254, 251, 254, 252, 254, 253, 254, 0, 109, 254, 0, 113, 254, 0, 115, 254,
-    0, 117,
-    254, 4, 105, 255, 108, 255, 0, 57, 255, 2, 99, 255, 17, 45, 255, 47, 255,
-    102, 255,
-    103, 254, 112, 255, 234, 255, 243, 255, 244, 255, 245, 255, 246, 255, 249,
-    255,
-    0, 25, 255, 0, 27, 255, 0, 51, 252, 0, 83, 255, 1, 32, 25, 9, 19, 102,
-    252, 112, 255,
-    233, 252, 234, 252, 235, 252, 236, 252, 243, 255, 244, 255, 245, 255, 246,
-    255,
-    247, 255, 249, 255, 0, 21, 252, 0, 25, 252, 0, 27, 252, 0, 29, 252, 0, 79,
-    255, 0, 83,
-    255, 2, 119, 250, 7, 119, 254, 120, 253, 121, 255, 122, 255, 254, 255, 0,
-    1, 255,
-    3, 45, 246, 47, 246, 21, 45, 251, 47, 251, 102, 254, 112, 254, 233, 254,
-    234, 254,
-    235, 254, 236, 254, 243, 254, 244, 254, 245, 254, 246, 254, 247, 254, 249,
-    254,
-    0, 21, 254, 0, 25, 254, 0, 27, 254, 0, 29, 254, 0, 79, 254, 0, 83, 254,
-    31, 45, 251,
-    47, 251, 98, 255, 102, 255, 112, 254, 225, 255, 226, 255, 227, 255, 228,
-    255, 229,
-    255, 230, 255, 233, 255, 234, 255, 235, 255, 236, 255, 243, 254, 244, 254,
-    245,
-    254, 246, 254, 247, 254, 249, 254, 0, 3, 255, 0, 5, 255, 0, 7, 255, 0, 21,
-    255, 0, 25,
-    255, 0, 27, 255, 0, 29, 255, 0, 79, 254, 0, 83, 254, 10, 102, 255, 233,
-    255, 234, 255,
-    235, 255, 236, 255, 0, 21, 255, 0, 25, 255, 0, 27, 255, 0, 29, 255, 3, 45,
-    251, 47,
-    251, 50, 68, 246, 72, 247, 80, 249, 82, 248, 85, 248, 86, 249, 87, 241,
-    88, 240, 90,
-    245, 118, 252, 119, 245, 120, 245, 122, 245, 200, 246, 211, 249, 212, 249,
-    213,
-    249, 214, 249, 215, 249, 217, 249, 218, 249, 219, 249, 220, 249, 221, 249,
-    222,
-    245, 250, 252, 251, 252, 252, 252, 253, 252, 254, 245, 0, 1, 245, 0, 8,
-    246, 0, 14,
-    246, 0, 32, 247, 0, 36, 247, 0, 78, 249, 0, 82, 249, 0, 100, 248, 0, 102,
-    248, 0, 108,
-    249, 0, 109, 252, 0, 112, 249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0,
-    116, 249,
-    0, 117, 252, 0, 122, 245, 1, 32, 25, 245, 50, 68, 246, 72, 247, 80, 249,
-    82, 248, 85,
-    248, 86, 249, 87, 241, 88, 240, 90, 245, 118, 252, 119, 245, 120, 245,
-    122, 245,
-    200, 246, 211, 249, 212, 249, 213, 249, 214, 249, 215, 249, 217, 249, 218,
-    249,
-    219, 249, 220, 249, 221, 249, 222, 245, 250, 252, 251, 252, 252, 252, 253,
-    252,
-    254, 245, 0, 1, 245, 0, 8, 246, 0, 14, 246, 0, 32, 247, 0, 36, 247, 0, 78,
-    249, 0, 82,
-    249, 0, 100, 248, 0, 102, 248, 0, 108, 249, 0, 109, 252, 0, 112, 249, 0,
-    113, 252,
-    0, 114, 249, 0, 115, 252, 0, 116, 249, 0, 117, 252, 0, 122, 245, 1, 32,
-    25, 245, 50,
-    68, 246, 72, 247, 80, 249, 82, 248, 85, 248, 86, 249, 87, 241, 88, 240,
-    90, 245, 118,
-    252, 119, 245, 120, 245, 122, 245, 200, 246, 211, 249, 212, 249, 213, 249,
-    214,
-    249, 215, 249, 217, 249, 218, 249, 219, 249, 220, 249, 221, 249, 222, 245,
-    250,
-    252, 251, 252, 252, 252, 253, 252, 254, 245, 0, 1, 245, 0, 8, 246, 0, 14,
-    246, 0, 32,
-    247, 0, 36, 247, 0, 78, 249, 0, 82, 249, 0, 100, 248, 0, 102, 248, 0, 108,
-    249, 0, 109,
-    252, 0, 112, 249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116, 249, 0,
-    117, 252,
-    0, 122, 245, 1, 32, 25, 245, 50, 68, 246, 72, 247, 80, 249, 82, 248, 85,
-    248, 86, 249,
-    87, 241, 88, 240, 90, 245, 118, 252, 119, 245, 120, 245, 122, 245, 200,
-    246, 211,
-    249, 212, 249, 213, 249, 214, 249, 215, 249, 217, 249, 218, 249, 219, 249,
-    220,
-    249, 221, 249, 222, 245, 250, 252, 251, 252, 252, 252, 253, 252, 254, 245,
-    0, 1,
-    245, 0, 8, 246, 0, 14, 246, 0, 32, 247, 0, 36, 247, 0, 78, 249, 0, 82,
-    249, 0, 100, 248,
-    0, 102, 248, 0, 108, 249, 0, 109, 252, 0, 112, 249, 0, 113, 252, 0, 114,
-    249, 0, 115,
-    252, 0, 116, 249, 0, 117, 252, 0, 122, 245, 1, 32, 25, 245, 50, 68, 246,
-    72, 247, 80,
-    249, 82, 248, 85, 248, 86, 249, 87, 241, 88, 240, 90, 245, 118, 252, 119,
-    245, 120,
-    245, 122, 245, 200, 246, 211, 249, 212, 249, 213, 249, 214, 249, 215, 249,
-    217,
-    249, 218, 249, 219, 249, 220, 249, 221, 249, 222, 245, 250, 252, 251, 252,
-    252,
-    252, 253, 252, 254, 245, 0, 1, 245, 0, 8, 246, 0, 14, 246, 0, 32, 247, 0,
-    36, 247, 0,
-    78, 249, 0, 82, 249, 0, 100, 248, 0, 102, 248, 0, 108, 249, 0, 109, 252,
-    0, 112, 249,
-    0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116, 249, 0, 117, 252, 0, 122,
-    245, 1, 32,
-    25, 245, 50, 68, 246, 72, 247, 80, 249, 82, 248, 85, 248, 86, 249, 87,
-    241, 88, 240,
-    90, 245, 118, 252, 119, 245, 120, 245, 122, 245, 200, 246, 211, 249, 212,
-    249, 213,
-    249, 214, 249, 215, 249, 217, 249, 218, 249, 219, 249, 220, 249, 221, 249,
-    222,
-    245, 250, 252, 251, 252, 252, 252, 253, 252, 254, 245, 0, 1, 245, 0, 8,
-    246, 0, 14,
-    246, 0, 32, 247, 0, 36, 247, 0, 78, 249, 0, 82, 249, 0, 100, 248, 0, 102,
-    248, 0, 108,
-    249, 0, 109, 252, 0, 112, 249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0,
-    116, 249,
-    0, 117, 252, 0, 122, 245, 1, 32, 25, 245, 11, 66, 252, 193, 252, 194, 252,
-    195, 252,
-    196, 252, 197, 252, 198, 252, 0, 2, 252, 0, 4, 252, 0, 6, 252, 20, 66,
-    250, 85, 250,
-    87, 249, 88, 249, 89, 250, 90, 249, 193, 250, 194, 250, 195, 250, 196,
-    250, 197,
-    250, 198, 250, 222, 249, 0, 2, 250, 0, 4, 250, 0, 6, 250, 0, 100, 250, 0,
-    102, 250,
-    0, 122, 249, 20, 66, 250, 85, 250, 87, 249, 88, 249, 89, 250, 90, 249,
-    193, 250, 194,
-    250, 195, 250, 196, 250, 197, 250, 198, 250, 222, 249, 0, 2, 250, 0, 4,
-    250, 0, 6,
-    250, 0, 100, 250, 0, 102, 250, 0, 122, 249, 20, 66, 250, 85, 250, 87, 249,
-    88, 249,
-    89, 250, 90, 249, 193, 250, 194, 250, 195, 250, 196, 250, 197, 250, 198,
-    250, 222,
-    249, 0, 2, 250, 0, 4, 250, 0, 6, 250, 0, 100, 250, 0, 102, 250, 0, 122,
-    249, 20, 66,
-    250, 85, 250, 87, 249, 88, 249, 89, 250, 90, 249, 193, 250, 194, 250, 195,
-    250, 196,
-    250, 197, 250, 198, 250, 222, 249, 0, 2, 250, 0, 4, 250, 0, 6, 250, 0,
-    100, 250, 0,
-    102, 250, 0, 122, 249, 20, 66, 250, 85, 250, 87, 249, 88, 249, 89, 250,
-    90, 249, 193,
-    250, 194, 250, 195, 250, 196, 250, 197, 250, 198, 250, 222, 249, 0, 2,
-    250, 0, 4,
-    250, 0, 6, 250, 0, 100, 250, 0, 102, 250, 0, 122, 249, 20, 66, 250, 85,
-    250, 87, 249,
-    88, 249, 89, 250, 90, 249, 193, 250, 194, 250, 195, 250, 196, 250, 197,
-    250, 198,
-    250, 222, 249, 0, 2, 250, 0, 4, 250, 0, 6, 250, 0, 100, 250, 0, 102, 250,
-    0, 122, 249,
-    11, 66, 249, 193, 249, 194, 249, 195, 249, 196, 249, 197, 249, 198, 249,
-    0, 2, 249,
-    0, 4, 249, 0, 6, 249, 11, 66, 249, 193, 249, 194, 249, 195, 249, 196, 249,
-    197, 249,
-    198, 249, 0, 2, 249, 0, 4, 249, 0, 6, 249, 11, 66, 249, 193, 249, 194,
-    249, 195, 249,
-    196, 249, 197, 249, 198, 249, 0, 2, 249, 0, 4, 249, 0, 6, 249, 11, 66,
-    249, 193, 249,
-    194, 249, 195, 249, 196, 249, 197, 249, 198, 249, 0, 2, 249, 0, 4, 249, 0,
-    6, 249,
-    65, 45, 242, 46, 242, 47, 245, 59, 242, 60, 242, 66, 245, 80, 253, 98,
-    242, 102, 238,
-    106, 248, 112, 238, 118, 242, 193, 245, 194, 245, 195, 245, 196, 245, 197,
-    245,
-    198, 245, 211, 253, 212, 253, 213, 253, 214, 253, 215, 253, 217, 253, 225,
-    242,
-    226, 242, 227, 242, 228, 242, 229, 242, 230, 242, 233, 245, 234, 238, 235,
-    245,
-    236, 245, 238, 248, 243, 238, 244, 238, 245, 238, 246, 238, 247, 238, 249,
-    238,
-    250, 242, 251, 242, 252, 242, 253, 242, 0, 2, 245, 0, 3, 242, 0, 4, 245,
-    0, 5, 242,
-    0, 6, 245, 0, 7, 242, 0, 21, 245, 0, 25, 238, 0, 27, 238, 0, 29, 238, 0,
-    49, 248, 0, 78,
-    253, 0, 79, 238, 0, 82, 253, 0, 83, 238, 0, 109, 242, 0, 113, 242, 0, 115,
-    242, 0, 117,
-    242, 4, 105, 255, 108, 255, 0, 57, 255, 2, 99, 255, 2, 99, 255, 2, 99,
-    255, 2, 99, 255,
-    2, 119, 250, 7, 119, 254, 120, 253, 121, 255, 122, 255, 254, 255, 0, 1,
-    255, 7, 119,
-    254, 120, 253, 121, 255, 122, 255, 254, 255, 0, 1, 255, 7, 119, 254, 120,
-    253, 121,
-    255, 122, 255, 254, 255, 0, 1, 255, 7, 119, 254, 120, 253, 121, 255, 122,
-    255, 254,
-    255, 0, 1, 255, 7, 119, 254, 120, 253, 121, 255, 122, 255, 254, 255, 0, 1,
-    255, 7,
-    119, 254, 120, 253, 121, 255, 122, 255, 254, 255, 0, 1, 255, 3, 45, 251,
-    47, 251,
-    3, 45, 251, 47, 251, 50, 68, 246, 72, 247, 80, 249, 82, 248, 85, 248, 86,
-    249, 87,
-    241, 88, 240, 90, 245, 118, 252, 119, 245, 120, 245, 122, 245, 200, 246,
-    211, 249,
-    212, 249, 213, 249, 214, 249, 215, 249, 217, 249, 218, 249, 219, 249, 220,
-    249,
-    221, 249, 222, 245, 250, 252, 251, 252, 252, 252, 253, 252, 254, 245, 0,
-    1, 245,
-    0, 8, 246, 0, 14, 246, 0, 32, 247, 0, 36, 247, 0, 78, 249, 0, 82, 249, 0,
-    100, 248, 0,
-    102, 248, 0, 108, 249, 0, 109, 252, 0, 112, 249, 0, 113, 252, 0, 114, 249,
-    0, 115,
-    252, 0, 116, 249, 0, 117, 252, 0, 122, 245, 1, 32, 25, 245, 50, 68, 246,
-    72, 247, 80,
-    249, 82, 248, 85, 248, 86, 249, 87, 241, 88, 240, 90, 245, 118, 252, 119,
-    245, 120,
-    245, 122, 245, 200, 246, 211, 249, 212, 249, 213, 249, 214, 249, 215, 249,
-    217,
-    249, 218, 249, 219, 249, 220, 249, 221, 249, 222, 245, 250, 252, 251, 252,
-    252,
-    252, 253, 252, 254, 245, 0, 1, 245, 0, 8, 246, 0, 14, 246, 0, 32, 247, 0,
-    36, 247, 0,
-    78, 249, 0, 82, 249, 0, 100, 248, 0, 102, 248, 0, 108, 249, 0, 109, 252,
-    0, 112, 249,
-    0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116, 249, 0, 117, 252, 0, 122,
-    245, 1, 32,
-    25, 245, 50, 68, 246, 72, 247, 80, 249, 82, 248, 85, 248, 86, 249, 87,
-    241, 88, 240,
-    90, 245, 118, 252, 119, 245, 120, 245, 122, 251, 200, 246, 211, 249, 212,
-    249, 213,
-    249, 214, 249, 215, 249, 217, 249, 218, 249, 219, 249, 220, 249, 221, 249,
-    222,
-    245, 250, 252, 251, 252, 252, 252, 253, 252, 254, 251, 0, 1, 251, 0, 8,
-    246, 0, 14,
-    246, 0, 32, 247, 0, 36, 247, 0, 78, 249, 0, 82, 249, 0, 100, 248, 0, 102,
-    248, 0, 108,
-    249, 0, 109, 252, 0, 112, 249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0,
-    116, 249,
-    0, 117, 252, 0, 122, 245, 1, 32, 25, 245, 4, 105, 255, 108, 255, 0, 57,
-    255, 4, 105,
-    255, 108, 255, 0, 57, 255, 16, 66, 253, 87, 249, 88, 250, 90, 249, 193,
-    253, 194,
-    253, 195, 253, 196, 253, 197, 253, 198, 253, 222, 249, 0, 2, 253, 0, 4,
-    253, 0, 6,
-    253, 0, 122, 249, 16, 66, 253, 87, 249, 88, 250, 90, 249, 193, 253, 194,
-    253, 195,
-    253, 196, 253, 197, 253, 198, 253, 222, 249, 0, 2, 253, 0, 4, 253, 0, 6,
-    253, 0, 122,
-    249, 2, 99, 255, 2, 99, 255, 2, 99, 255, 2, 99, 255, 40, 80, 252, 102,
-    253, 112, 253,
-    118, 254, 122, 254, 211, 252, 212, 252, 213, 252, 214, 252, 215, 252, 217,
-    252,
-    233, 253, 234, 253, 235, 253, 236, 253, 243, 253, 244, 253, 245, 253, 246,
-    253,
-    247, 253, 249, 253, 250, 254, 251, 254, 252, 254, 253, 254, 254, 254, 0,
-    1, 254,
-    0, 21, 253, 0, 25, 253, 0, 27, 253, 0, 29, 253, 0, 78, 252, 0, 79, 253, 0,
-    82, 252, 0,
-    83, 253, 0, 109, 254, 0, 113, 254, 0, 115, 254, 0, 117, 254, 19, 102, 252,
-    112, 255,
-    233, 252, 234, 252, 235, 252, 236, 252, 243, 255, 244, 255, 245, 255, 246,
-    255,
-    247, 255, 249, 255, 0, 21, 252, 0, 25, 252, 0, 27, 252, 0, 29, 252, 0, 79,
-    255, 0, 83,
-    255, 13, 85, 254, 87, 251, 88, 251, 90, 251, 122, 251, 222, 251, 254, 251,
-    0, 1, 251,
-    0, 100, 254, 0, 102, 254, 0, 122, 251, 1, 32, 25, 248, 13, 85, 254, 87,
-    251, 88, 251,
-    90, 251, 122, 251, 222, 251, 254, 251, 0, 1, 251, 0, 100, 254, 0, 102,
-    254, 0, 122,
-    251, 1, 32, 25, 248, 13, 85, 254, 87, 251, 88, 251, 90, 251, 122, 251,
-    222, 251, 254,
-    251, 0, 1, 251, 0, 100, 254, 0, 102, 254, 0, 122, 251, 1, 32, 25, 248, 11,
-    66, 252,
-    193, 252, 194, 252, 195, 252, 196, 252, 197, 252, 198, 252, 0, 2, 252, 0,
-    4, 252,
-    0, 6, 252, 2, 119, 250, 11, 66, 252, 193, 252, 194, 252, 195, 252, 196,
-    252, 197,
-    252, 198, 252, 0, 2, 252, 0, 4, 252, 0, 6, 252, 2, 119, 250, 11, 66, 252,
-    193, 252,
-    194, 252, 195, 252, 196, 252, 197, 252, 198, 252, 0, 2, 252, 0, 4, 252, 0,
-    6, 252,
-    2, 119, 250, 20, 66, 250, 85, 250, 87, 249, 88, 249, 89, 250, 90, 249,
-    193, 250, 194,
-    250, 195, 250, 196, 250, 197, 250, 198, 250, 222, 249, 0, 2, 250, 0, 4,
-    250, 0, 6,
-    250, 0, 100, 250, 0, 102, 250, 0, 122, 249, 7, 119, 254, 120, 253, 121,
-    255, 122,
-    255, 254, 255, 0, 1, 255, 20, 66, 250, 85, 250, 87, 249, 88, 249, 89, 250,
-    90, 249,
-    193, 250, 194, 250, 195, 250, 196, 250, 197, 250, 198, 250, 222, 249, 0,
-    2, 250,
-    0, 4, 250, 0, 6, 250, 0, 100, 250, 0, 102, 250, 0, 122, 249, 7, 119, 254,
-    120, 253,
-    121, 255, 122, 255, 254, 255, 0, 1, 255, 27, 80, 250, 85, 252, 86, 250,
-    87, 254, 88,
-    254, 90, 254, 211, 250, 212, 250, 213, 250, 214, 250, 215, 250, 217, 250,
-    218, 250,
-    219, 250, 220, 250, 221, 250, 222, 254, 0, 78, 250, 0, 82, 250, 0, 100,
-    252, 0, 102,
-    252, 0, 108, 250, 0, 112, 250, 0, 114, 250, 0, 116, 250, 0, 122, 254, 3,
-    45, 246, 47,
-    246, 27, 80, 250, 85, 252, 86, 250, 87, 254, 88, 254, 90, 254, 211, 250,
-    212, 250,
-    213, 250, 214, 250, 215, 250, 217, 250, 218, 250, 219, 250, 220, 250, 221,
-    250,
-    222, 254, 0, 78, 250, 0, 82, 250, 0, 100, 252, 0, 102, 252, 0, 108, 250,
-    0, 112, 250,
-    0, 114, 250, 0, 116, 250, 0, 122, 254, 3, 45, 246, 47, 246, 27, 80, 250,
-    85, 252, 86,
-    250, 87, 254, 88, 254, 90, 254, 211, 250, 212, 250, 213, 250, 214, 250,
-    215, 250,
-    217, 250, 218, 250, 219, 250, 220, 250, 221, 250, 222, 254, 0, 78, 250, 0,
-    82, 250,
-    0, 100, 252, 0, 102, 252, 0, 108, 250, 0, 112, 250, 0, 114, 250, 0, 116,
-    250, 0, 122,
-    254, 3, 45, 246, 47, 246, 73, 45, 242, 46, 242, 47, 242, 59, 245, 60, 245,
-    66, 248,
-    80, 254, 98, 242, 102, 242, 106, 251, 112, 241, 115, 251, 118, 251, 120,
-    251, 122,
-    251, 193, 248, 194, 248, 195, 248, 196, 248, 197, 248, 198, 248, 211, 254,
-    212,
-    254, 213, 254, 214, 254, 215, 254, 217, 254, 225, 242, 226, 242, 227, 242,
-    228,
-    242, 229, 242, 230, 242, 233, 248, 234, 242, 235, 242, 236, 248, 238, 251,
-    243,
-    241, 244, 241, 245, 241, 246, 241, 247, 241, 249, 241, 250, 251, 251, 251,
-    252,
-    251, 253, 251, 254, 251, 0, 1, 251, 0, 2, 248, 0, 3, 242, 0, 4, 248, 0, 5,
-    242, 0, 6,
-    248, 0, 7, 242, 0, 21, 248, 0, 25, 242, 0, 27, 242, 0, 29, 242, 0, 49,
-    251, 0, 78, 254,
-    0, 79, 241, 0, 82, 254, 0, 83, 241, 0, 87, 251, 0, 89, 251, 0, 91, 251, 0,
-    109, 251,
-    0, 113, 251, 0, 115, 251, 0, 117, 251, 73, 45, 242, 46, 242, 47, 242, 59,
-    245, 60,
-    245, 66, 248, 80, 254, 98, 242, 102, 242, 106, 251, 112, 241, 115, 251,
-    118, 251,
-    120, 251, 122, 251, 193, 248, 194, 248, 195, 248, 196, 248, 197, 248, 198,
-    248,
-    211, 254, 212, 254, 213, 254, 214, 254, 215, 254, 217, 254, 225, 242, 226,
-    242,
-    227, 242, 228, 242, 229, 242, 230, 242, 233, 248, 234, 242, 235, 242, 236,
-    248,
-    238, 251, 243, 241, 244, 241, 245, 241, 246, 241, 247, 241, 249, 241, 250,
-    251,
-    251, 251, 252, 251, 253, 251, 254, 251, 0, 1, 251, 0, 2, 248, 0, 3, 242,
-    0, 4, 248,
-    0, 5, 242, 0, 6, 248, 0, 7, 242, 0, 21, 248, 0, 25, 242, 0, 27, 242, 0,
-    29, 242, 0, 49,
-    251, 0, 78, 254, 0, 79, 241, 0, 82, 254, 0, 83, 241, 0, 87, 251, 0, 89,
-    251, 0, 91, 251,
-    0, 109, 251, 0, 113, 251, 0, 115, 251, 0, 117, 251, 11, 66, 249, 193, 249,
-    194, 249,
-    195, 249, 196, 249, 197, 249, 198, 249, 0, 2, 249, 0, 4, 249, 0, 6, 249,
-    11, 66, 249,
-    193, 249, 194, 249, 195, 249, 196, 249, 197, 249, 198, 249, 0, 2, 249, 0,
-    4, 249,
-    0, 6, 249, 11, 66, 249, 193, 249, 194, 249, 195, 249, 196, 249, 197, 249,
-    198, 249,
-    0, 2, 249, 0, 4, 249, 0, 6, 249, 11, 66, 249, 193, 249, 194, 249, 195,
-    249, 196, 249,
-    197, 249, 198, 249, 0, 2, 249, 0, 4, 249, 0, 6, 249, 65, 45, 242, 46, 242,
-    47, 245,
-    59, 242, 60, 242, 66, 245, 80, 253, 98, 242, 102, 238, 106, 248, 112, 238,
-    118, 242,
-    193, 245, 194, 245, 195, 245, 196, 245, 197, 245, 198, 245, 211, 253, 212,
-    253,
-    213, 253, 214, 253, 215, 253, 217, 253, 225, 242, 226, 242, 227, 242, 228,
-    242,
-    229, 242, 230, 242, 233, 245, 234, 238, 235, 245, 236, 245, 238, 248, 243,
-    238,
-    244, 238, 245, 238, 246, 238, 247, 238, 249, 238, 250, 242, 251, 242, 252,
-    242,
-    253, 242, 0, 2, 245, 0, 3, 242, 0, 4, 245, 0, 5, 242, 0, 6, 245, 0, 7,
-    242, 0, 21, 245,
-    0, 25, 238, 0, 27, 238, 0, 29, 238, 0, 49, 248, 0, 78, 253, 0, 79, 238, 0,
-    82, 253, 0,
-    83, 238, 0, 109, 242, 0, 113, 242, 0, 115, 242, 0, 117, 242, 2, 1, 32, 24,
-    245, 17,
-    33, 245, 101, 254, 115, 254, 116, 245, 117, 251, 119, 254, 0, 19, 254, 0,
-    87, 254,
-    0, 89, 254, 0, 91, 254, 0, 93, 245, 0, 97, 245, 0, 99, 245, 0, 101, 251,
-    1, 2, 25, 245,
-    1, 32, 25, 245
-};
-static afm_cuint16 afm_Times_BoldItalic_highchars_index[] = {   /* 220 */
-    161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176,
-    177,
-    178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192,
-    193,
-    194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208,
-    209,
-    210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224,
-    225,
-    226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240,
-    241,
-    242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256,
-    257,
-    258, 259, 260, 261, 262, 263, 268, 269, 270, 271, 272, 273, 274, 275, 278,
-    279,
-    280, 281, 282, 283, 286, 287, 290, 291, 298, 299, 302, 303, 304, 305, 310,
-    311,
-    313, 314, 315, 316, 317, 318, 321, 322, 323, 324, 325, 326, 327, 328, 332,
-    333,
-    336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 350, 351, 352,
-    353,
-    354, 355, 356, 357, 362, 363, 366, 367, 368, 369, 370, 371, 376, 377, 378,
-    379,
-    380, 381, 382, 402, 536, 537, 710, 711, 728, 729, 730, 731, 732, 733,
-    8211, 8212,
-    8216, 8217, 8218, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8249,
-    8250,
-    8260, 8364, 8482, 8706, 8710, 8721, 8722, 8730, 8800, 8804, 8805, 9674,
-    63171,
-    64257, 64258
-};
-static afm_cunicode afm_Times_BoldItalic_ligatures[] = {    /* 3 */
-    102, 105, 64257
-};
-
-
-/* ------------------------------------------------------------------*/
-/* FontName: Times-Italic */
-/* FullName: Times Italic */
-/* FamilyName: Times */
-static afm_cuint8 afm_Times_Italic_widths[] = { /* 315 */
-    42, 56, 70, 83, 83, 139, 130, 36, 56, 56, 83, 113, 42, 56, 42, 46, 83, 83,
-    83, 83, 83,
-    83, 83, 83, 83, 83, 56, 56, 113, 113, 113, 83, 153, 102, 102, 111, 120,
-    102, 102,
-    120, 120, 56, 74, 111, 93, 139, 111, 120, 102, 120, 102, 83, 93, 120, 102,
-    139, 102,
-    93, 93, 65, 46, 65, 70, 83, 56, 83, 83, 74, 83, 74, 46, 83, 83, 46, 46,
-    74, 46, 120,
-    83, 83, 83, 83, 65, 65, 46, 83, 74, 111, 74, 74, 65, 67, 46, 67, 90, 65,
-    83, 83, 83,
-    83, 46, 83, 56, 127, 46, 83, 113, 127, 56, 67, 113, 50, 50, 56, 83, 87,
-    42, 56, 50,
-    52, 83, 125, 125, 125, 83, 102, 102, 102, 102, 102, 102, 148, 111, 102,
-    102, 102,
-    102, 56, 56, 56, 56, 120, 111, 120, 120, 120, 120, 120, 113, 120, 120,
-    120, 120,
-    120, 93, 102, 83, 83, 83, 83, 83, 83, 83, 111, 74, 74, 74, 74, 74, 46, 46,
-    46, 46, 83,
-    83, 83, 83, 83, 83, 83, 113, 83, 83, 83, 83, 83, 74, 83, 74, 102, 83, 102,
-    83, 102,
-    83, 111, 74, 111, 74, 120, 91, 120, 83, 102, 74, 102, 74, 102, 74, 102,
-    74, 120, 83,
-    120, 83, 56, 46, 56, 46, 56, 46, 111, 74, 93, 46, 93, 46, 102, 50, 93, 46,
-    111, 83,
-    111, 83, 111, 83, 120, 83, 120, 83, 157, 111, 102, 65, 102, 65, 102, 65,
-    83, 65, 83,
-    65, 83, 65, 93, 46, 93, 50, 120, 83, 120, 83, 120, 83, 120, 83, 93, 93,
-    65, 93, 65,
-    93, 65, 83, 83, 65, 56, 56, 56, 56, 56, 56, 56, 56, 83, 148, 56, 56, 56,
-    93, 93, 93,
-    83, 83, 58, 148, 167, 56, 56, 28, 83, 163, 79, 102, 100, 113, 76, 92, 92,
-    92, 79, 42,
-    83, 83
-};
-static afm_sint16 afm_Times_Italic_kerning_index[] = {  /* 315 */
-    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0,
-    0, 0, 62, 181, 0, 227, 0, 262, 0, 0, 0, 382, 497, 589, 0, 620, 644, 689,
-    782, 805, 0,
-    859, 1027, 1055, 1212, 0, 1367, 0, 0, 0, 0, 0, 0, 0, 1524, 1533, 1558, 0,
-    1566, 1592,
-    1611, 0, 0, 0, 1646, 0, 0, 1696, 1699, 0, 0, 1710, 0, 0, 0, 1822, 1827, 0,
-    1832, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0,
-    0, 0, 1837, 1956, 2075, 2194, 2313, 2432, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    2551, 2575,
-    2620, 2665, 2710, 2755, 0, 2800, 2845, 2873, 2901, 2929, 2957, 0, 0, 3114,
-    3123,
-    3132, 3141, 3150, 3159, 0, 3168, 3176, 3202, 3228, 3254, 0, 0, 0, 0, 0,
-    3280, 3283,
-    3294, 3305, 3316, 3327, 0, 3338, 0, 0, 0, 0, 3349, 0, 3354, 3359, 3478,
-    3487, 3606,
-    3615, 3734, 0, 3743, 0, 3751, 3759, 0, 3794, 0, 0, 3829, 0, 3855, 0, 3881,
-    0, 3907,
-    0, 3933, 0, 3968, 0, 0, 0, 0, 0, 0, 4003, 4095, 4145, 0, 4176, 0, 0, 0,
-    4207, 0, 4238,
-    4262, 4265, 4289, 4292, 4316, 4319, 4364, 4375, 4420, 0, 0, 4431, 4485,
-    4597,
-    4651, 4763, 4817, 0, 0, 0, 0, 0, 0, 4929, 0, 5097, 0, 5265, 0, 5293, 0,
-    5321, 0, 5349,
-    0, 5377, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5534,
-    5539, 0, 0, 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 afm_cuint8 afm_Times_Italic_kerning_data[] = {   /* 5584 */
-    42, 19, 66, 254, 85, 254, 87, 251, 88, 250, 90, 244, 193, 254, 194, 254,
-    195, 254,
-    196, 254, 197, 254, 198, 254, 222, 244, 0, 2, 254, 0, 4, 254, 0, 6, 254,
-    0, 100, 254,
-    0, 102, 254, 0, 122, 244, 3, 1, 32, 25, 234, 1, 32, 29, 234, 3, 1, 32, 25,
-    234, 1, 32,
-    29, 234, 50, 68, 252, 72, 251, 80, 250, 82, 250, 85, 251, 86, 249, 87,
-    239, 88, 241,
-    90, 248, 118, 254, 119, 248, 120, 248, 122, 248, 200, 252, 211, 250, 212,
-    250, 213,
-    250, 214, 250, 215, 250, 217, 250, 218, 249, 219, 249, 220, 249, 221, 249,
-    222,
-    248, 250, 254, 251, 254, 252, 254, 253, 254, 254, 248, 0, 1, 248, 0, 8,
-    252, 0, 14,
-    252, 0, 32, 251, 0, 36, 251, 0, 78, 250, 0, 82, 250, 0, 100, 251, 0, 102,
-    251, 0, 108,
-    249, 0, 109, 254, 0, 112, 249, 0, 113, 254, 0, 114, 249, 0, 115, 254, 0,
-    116, 249,
-    0, 117, 254, 0, 122, 248, 1, 32, 25, 251, 20, 66, 253, 86, 255, 193, 253,
-    194, 253,
-    195, 253, 196, 253, 197, 253, 198, 253, 218, 255, 219, 255, 220, 255, 221,
-    255,
-    0, 2, 253, 0, 4, 253, 0, 6, 253, 0, 108, 255, 0, 112, 255, 0, 114, 255, 0,
-    116, 255,
-    16, 66, 251, 87, 250, 88, 250, 90, 250, 193, 251, 194, 251, 195, 251, 196,
-    251, 197,
-    251, 198, 251, 222, 250, 0, 2, 251, 0, 4, 251, 0, 6, 251, 0, 122, 250, 52,
-    45, 234,
-    47, 234, 66, 238, 98, 244, 102, 244, 106, 249, 112, 239, 115, 248, 193,
-    238, 194,
-    238, 195, 238, 196, 238, 197, 238, 198, 238, 225, 244, 226, 244, 227, 244,
-    228,
-    244, 229, 244, 230, 244, 233, 244, 234, 244, 235, 244, 236, 244, 237, 249,
-    238,
-    249, 239, 249, 240, 249, 243, 239, 244, 239, 245, 239, 246, 239, 247, 239,
-    249,
-    239, 0, 2, 238, 0, 3, 244, 0, 4, 238, 0, 5, 244, 0, 6, 238, 0, 7, 244, 0,
-    21, 244, 0, 25,
-    244, 0, 27, 244, 0, 29, 244, 0, 45, 249, 0, 49, 249, 0, 79, 239, 0, 83,
-    239, 0, 87, 248,
-    0, 89, 248, 0, 91, 248, 50, 45, 253, 47, 253, 66, 250, 98, 251, 102, 253,
-    112, 253,
-    118, 251, 193, 250, 194, 250, 195, 250, 196, 250, 197, 250, 198, 250, 225,
-    251,
-    226, 251, 227, 251, 228, 251, 229, 251, 230, 251, 233, 253, 234, 253, 235,
-    253,
-    236, 253, 243, 253, 244, 253, 245, 253, 246, 253, 247, 253, 249, 253, 250,
-    251,
-    251, 251, 252, 251, 253, 251, 0, 2, 250, 0, 3, 251, 0, 4, 250, 0, 5, 251,
-    0, 6, 250,
-    0, 7, 251, 0, 21, 253, 0, 25, 253, 0, 27, 253, 0, 29, 253, 0, 79, 253, 0,
-    83, 253, 0,
-    109, 251, 0, 113, 251, 0, 115, 251, 0, 117, 251, 40, 80, 249, 102, 251,
-    112, 250,
-    118, 250, 122, 250, 211, 249, 212, 249, 213, 249, 214, 249, 215, 249, 217,
-    249,
-    233, 251, 234, 251, 235, 251, 236, 251, 243, 250, 244, 250, 245, 250, 246,
-    250,
-    247, 250, 249, 250, 250, 250, 251, 250, 252, 250, 253, 250, 254, 250, 0,
-    1, 250,
-    0, 21, 251, 0, 25, 251, 0, 27, 251, 0, 29, 251, 0, 78, 249, 0, 79, 250, 0,
-    82, 249, 0,
-    83, 250, 0, 109, 250, 0, 113, 250, 0, 115, 250, 0, 117, 250, 13, 85, 254,
-    87, 248,
-    88, 248, 90, 254, 122, 252, 222, 254, 254, 252, 0, 1, 252, 0, 100, 254, 0,
-    102, 254,
-    0, 122, 254, 1, 32, 25, 251, 11, 66, 252, 193, 252, 194, 252, 195, 252,
-    196, 252,
-    197, 252, 198, 252, 0, 2, 252, 0, 4, 252, 0, 6, 252, 20, 66, 248, 85, 250,
-    87, 249,
-    88, 249, 89, 250, 90, 249, 193, 248, 194, 248, 195, 248, 196, 248, 197,
-    248, 198,
-    248, 222, 249, 0, 2, 248, 0, 4, 248, 0, 6, 248, 0, 100, 250, 0, 102, 250,
-    0, 122, 249,
-    41, 45, 234, 47, 234, 66, 242, 98, 244, 102, 244, 112, 244, 193, 242, 194,
-    242, 195,
-    242, 196, 242, 197, 242, 198, 242, 225, 244, 226, 244, 227, 244, 228, 244,
-    229,
-    244, 230, 244, 233, 244, 234, 244, 235, 244, 236, 244, 243, 244, 244, 244,
-    245,
-    244, 246, 244, 247, 244, 249, 244, 0, 2, 242, 0, 3, 244, 0, 4, 242, 0, 5,
-    244, 0, 6,
-    242, 0, 7, 244, 0, 21, 244, 0, 25, 244, 0, 27, 244, 0, 29, 244, 0, 79,
-    244, 0, 83, 244,
-    10, 86, 255, 218, 255, 219, 255, 220, 255, 221, 255, 0, 108, 255, 0, 112,
-    255, 0,
-    114, 255, 0, 116, 255, 24, 80, 250, 86, 250, 87, 254, 88, 254, 90, 254,
-    211, 250,
-    212, 250, 213, 250, 214, 250, 215, 250, 217, 250, 218, 250, 219, 250, 220,
-    250,
-    221, 250, 222, 254, 0, 78, 250, 0, 82, 250, 0, 108, 250, 0, 112, 250, 0,
-    114, 250,
-    0, 116, 250, 0, 122, 254, 73, 45, 245, 46, 245, 47, 245, 59, 248, 60, 246,
-    66, 249,
-    80, 254, 98, 242, 102, 242, 106, 248, 112, 242, 115, 248, 118, 248, 120,
-    245, 122,
-    245, 193, 249, 194, 249, 195, 249, 196, 249, 197, 249, 198, 249, 211, 254,
-    212,
-    254, 213, 254, 214, 254, 215, 254, 217, 254, 225, 242, 226, 242, 227, 242,
-    228,
-    242, 229, 242, 230, 242, 233, 248, 234, 242, 235, 248, 236, 248, 238, 248,
-    243,
-    242, 244, 242, 245, 242, 246, 242, 247, 242, 249, 242, 250, 248, 251, 248,
-    252,
-    248, 253, 248, 254, 245, 0, 1, 251, 0, 2, 249, 0, 3, 242, 0, 4, 249, 0, 5,
-    242, 0, 6,
-    249, 0, 7, 242, 0, 21, 248, 0, 25, 242, 0, 27, 242, 0, 29, 242, 0, 49,
-    248, 0, 78, 254,
-    0, 79, 242, 0, 82, 254, 0, 83, 242, 0, 87, 248, 0, 89, 248, 0, 91, 248, 0,
-    109, 248,
-    0, 113, 248, 0, 115, 248, 0, 117, 248, 13, 45, 253, 47, 253, 66, 250, 193,
-    250, 194,
-    250, 195, 250, 196, 250, 197, 250, 198, 250, 0, 2, 250, 0, 4, 250, 0, 6,
-    250, 69, 45,
-    235, 46, 248, 47, 235, 59, 246, 60, 245, 66, 247, 80, 252, 98, 238, 102,
-    238, 106,
-    245, 112, 238, 118, 245, 193, 247, 194, 247, 195, 247, 196, 247, 197, 247,
-    198,
-    247, 211, 252, 212, 252, 213, 252, 214, 252, 215, 252, 217, 252, 225, 238,
-    226,
-    238, 227, 238, 228, 238, 229, 238, 230, 238, 233, 245, 234, 238, 235, 238,
-    236,
-    245, 237, 251, 238, 245, 239, 251, 240, 251, 243, 238, 244, 238, 245, 238,
-    246,
-    238, 247, 238, 249, 238, 250, 245, 251, 245, 252, 245, 253, 245, 0, 2,
-    247, 0, 3,
-    238, 0, 4, 247, 0, 5, 238, 0, 6, 247, 0, 7, 238, 0, 21, 245, 0, 25, 238,
-    0, 27, 238, 0,
-    29, 238, 0, 45, 251, 0, 49, 245, 0, 78, 252, 0, 79, 238, 0, 82, 252, 0,
-    83, 238, 0, 109,
-    245, 0, 113, 245, 0, 115, 245, 0, 117, 245, 68, 45, 242, 46, 251, 47, 242,
-    59, 246,
-    60, 246, 66, 247, 80, 253, 98, 242, 102, 242, 106, 248, 112, 242, 118,
-    248, 122,
-    245, 193, 247, 194, 247, 195, 247, 196, 247, 197, 247, 198, 247, 211, 253,
-    212,
-    253, 213, 253, 214, 253, 215, 253, 217, 253, 225, 242, 226, 242, 227, 242,
-    228,
-    242, 229, 242, 230, 242, 233, 248, 234, 242, 235, 242, 236, 248, 238, 248,
-    243,
-    242, 244, 242, 245, 242, 246, 242, 247, 242, 249, 242, 250, 248, 251, 248,
-    252,
-    248, 253, 248, 254, 245, 0, 1, 245, 0, 2, 247, 0, 3, 242, 0, 4, 247, 0, 5,
-    242, 0, 6,
-    247, 0, 7, 242, 0, 21, 248, 0, 25, 242, 0, 27, 242, 0, 29, 242, 0, 49,
-    248, 0, 78, 253,
-    0, 79, 242, 0, 82, 253, 0, 83, 242, 0, 109, 248, 0, 113, 248, 0, 115, 248,
-    0, 117, 248,
-    69, 45, 242, 46, 245, 47, 242, 59, 246, 60, 246, 66, 249, 80, 254, 98,
-    242, 102, 242,
-    106, 245, 112, 242, 118, 242, 193, 249, 194, 249, 195, 249, 196, 249, 197,
-    249,
-    198, 249, 211, 254, 212, 254, 213, 254, 214, 254, 215, 254, 217, 254, 225,
-    242,
-    226, 242, 227, 242, 228, 242, 229, 242, 230, 242, 233, 248, 234, 242, 235,
-    242,
-    236, 248, 237, 251, 238, 245, 239, 251, 240, 251, 243, 242, 244, 242, 245,
-    242,
-    246, 242, 247, 242, 249, 242, 250, 242, 251, 242, 252, 242, 253, 242, 0,
-    2, 249,
-    0, 3, 242, 0, 4, 249, 0, 5, 242, 0, 6, 249, 0, 7, 242, 0, 21, 248, 0, 25,
-    242, 0, 27, 242,
-    0, 29, 242, 0, 45, 251, 0, 49, 245, 0, 78, 254, 0, 79, 242, 0, 82, 254, 0,
-    83, 242, 0,
-    109, 242, 0, 113, 242, 0, 115, 242, 0, 117, 242, 4, 104, 255, 0, 33, 255,
-    0, 37, 255,
-    11, 47, 250, 118, 254, 250, 254, 251, 254, 252, 254, 253, 254, 0, 109,
-    254, 0, 113,
-    254, 0, 115, 254, 0, 117, 254, 4, 105, 254, 108, 254, 0, 57, 254, 12, 45,
-    255, 47,
-    254, 104, 250, 119, 254, 120, 254, 121, 254, 122, 252, 254, 252, 0, 1,
-    252, 0, 33,
-    250, 0, 37, 250, 8, 45, 255, 47, 254, 103, 254, 106, 254, 0, 49, 254, 0,
-    51, 247, 1,
-    32, 25, 15, 15, 45, 255, 47, 254, 102, 255, 104, 255, 233, 255, 234, 255,
-    235, 255,
-    236, 255, 0, 21, 255, 0, 25, 255, 0, 27, 255, 0, 29, 255, 0, 33, 255, 0,
-    37, 255, 22,
-    102, 255, 112, 255, 122, 255, 233, 255, 234, 255, 235, 255, 236, 255, 243,
-    255,
-    244, 255, 245, 255, 246, 255, 247, 255, 249, 255, 254, 255, 0, 1, 255, 0,
-    21, 255,
-    0, 25, 255, 0, 27, 255, 0, 29, 255, 0, 79, 255, 0, 83, 255, 2, 119, 250,
-    5, 104, 255,
-    119, 255, 0, 33, 255, 0, 37, 255, 47, 45, 238, 46, 254, 47, 238, 98, 254,
-    100, 251,
-    101, 251, 102, 251, 104, 251, 112, 249, 114, 251, 116, 255, 225, 254, 226,
-    254,
-    227, 254, 228, 254, 229, 254, 230, 254, 232, 251, 233, 251, 234, 251, 235,
-    251,
-    236, 251, 243, 249, 244, 249, 245, 249, 246, 249, 247, 249, 249, 249, 0,
-    3, 254,
-    0, 5, 254, 0, 7, 254, 0, 9, 251, 0, 15, 251, 0, 19, 251, 0, 21, 251, 0,
-    25, 251, 0, 27,
-    251, 0, 29, 251, 0, 33, 251, 0, 37, 251, 0, 79, 249, 0, 83, 249, 0, 93,
-    255, 0, 97, 255,
-    0, 99, 255, 1, 2, 25, 255, 3, 45, 245, 47, 245, 3, 45, 245, 47, 245, 3,
-    45, 248, 47,
-    248, 50, 68, 252, 72, 251, 80, 250, 82, 250, 85, 251, 86, 249, 87, 239,
-    88, 241, 90,
-    248, 118, 254, 119, 248, 120, 248, 122, 248, 200, 252, 211, 250, 212, 250,
-    213,
-    250, 214, 250, 215, 250, 217, 250, 218, 249, 219, 249, 220, 249, 221, 249,
-    222,
-    248, 250, 254, 251, 254, 252, 254, 253, 254, 254, 248, 0, 1, 248, 0, 8,
-    252, 0, 14,
-    252, 0, 32, 251, 0, 36, 251, 0, 78, 250, 0, 82, 250, 0, 100, 251, 0, 102,
-    251, 0, 108,
-    249, 0, 109, 254, 0, 112, 249, 0, 113, 254, 0, 114, 249, 0, 115, 254, 0,
-    116, 249,
-    0, 117, 254, 0, 122, 248, 1, 32, 25, 251, 50, 68, 252, 72, 251, 80, 250,
-    82, 250, 85,
-    251, 86, 249, 87, 239, 88, 241, 90, 248, 118, 254, 119, 248, 120, 248,
-    122, 248,
-    200, 252, 211, 250, 212, 250, 213, 250, 214, 250, 215, 250, 217, 250, 218,
-    249,
-    219, 249, 220, 249, 221, 249, 222, 248, 250, 254, 251, 254, 252, 254, 253,
-    254,
-    254, 248, 0, 1, 248, 0, 8, 252, 0, 14, 252, 0, 32, 251, 0, 36, 251, 0, 78,
-    250, 0, 82,
-    250, 0, 100, 251, 0, 102, 251, 0, 108, 249, 0, 109, 254, 0, 112, 249, 0,
-    113, 254,
-    0, 114, 249, 0, 115, 254, 0, 116, 249, 0, 117, 254, 0, 122, 248, 1, 32,
-    25, 251, 50,
-    68, 252, 72, 251, 80, 250, 82, 250, 85, 251, 86, 249, 87, 239, 88, 241,
-    90, 248, 118,
-    254, 119, 248, 120, 248, 122, 248, 200, 252, 211, 250, 212, 250, 213, 250,
-    214,
-    250, 215, 250, 217, 250, 218, 249, 219, 249, 220, 249, 221, 249, 222, 248,
-    250,
-    254, 251, 254, 252, 254, 253, 254, 254, 248, 0, 1, 248, 0, 8, 252, 0, 14,
-    252, 0, 32,
-    251, 0, 36, 251, 0, 78, 250, 0, 82, 250, 0, 100, 251, 0, 102, 251, 0, 108,
-    249, 0, 109,
-    254, 0, 112, 249, 0, 113, 254, 0, 114, 249, 0, 115, 254, 0, 116, 249, 0,
-    117, 254,
-    0, 122, 248, 1, 32, 25, 251, 50, 68, 252, 72, 251, 80, 250, 82, 250, 85,
-    251, 86, 249,
-    87, 239, 88, 241, 90, 248, 118, 254, 119, 248, 120, 248, 122, 248, 200,
-    252, 211,
-    250, 212, 250, 213, 250, 214, 250, 215, 250, 217, 250, 218, 249, 219, 249,
-    220,
-    249, 221, 249, 222, 248, 250, 254, 251, 254, 252, 254, 253, 254, 254, 248,
-    0, 1,
-    248, 0, 8, 252, 0, 14, 252, 0, 32, 251, 0, 36, 251, 0, 78, 250, 0, 82,
-    250, 0, 100, 251,
-    0, 102, 251, 0, 108, 249, 0, 109, 254, 0, 112, 249, 0, 113, 254, 0, 114,
-    249, 0, 115,
-    254, 0, 116, 249, 0, 117, 254, 0, 122, 248, 1, 32, 25, 251, 50, 68, 252,
-    72, 251, 80,
-    250, 82, 250, 85, 251, 86, 249, 87, 239, 88, 241, 90, 248, 118, 254, 119,
-    248, 120,
-    248, 122, 248, 200, 252, 211, 250, 212, 250, 213, 250, 214, 250, 215, 250,
-    217,
-    250, 218, 249, 219, 249, 220, 249, 221, 249, 222, 248, 250, 254, 251, 254,
-    252,
-    254, 253, 254, 254, 248, 0, 1, 248, 0, 8, 252, 0, 14, 252, 0, 32, 251, 0,
-    36, 251, 0,
-    78, 250, 0, 82, 250, 0, 100, 251, 0, 102, 251, 0, 108, 249, 0, 109, 254,
-    0, 112, 249,
-    0, 113, 254, 0, 114, 249, 0, 115, 254, 0, 116, 249, 0, 117, 254, 0, 122,
-    248, 1, 32,
-    25, 251, 50, 68, 252, 72, 251, 80, 250, 82, 250, 85, 251, 86, 249, 87,
-    239, 88, 241,
-    90, 248, 118, 254, 119, 248, 120, 248, 122, 248, 200, 252, 211, 250, 212,
-    250, 213,
-    250, 214, 250, 215, 250, 217, 250, 218, 249, 219, 249, 220, 249, 221, 249,
-    222,
-    248, 250, 254, 251, 254, 252, 254, 253, 254, 254, 248, 0, 1, 248, 0, 8,
-    252, 0, 14,
-    252, 0, 32, 251, 0, 36, 251, 0, 78, 250, 0, 82, 250, 0, 100, 251, 0, 102,
-    251, 0, 108,
-    249, 0, 109, 254, 0, 112, 249, 0, 113, 254, 0, 114, 249, 0, 115, 254, 0,
-    116, 249,
-    0, 117, 254, 0, 122, 248, 1, 32, 25, 251, 11, 66, 252, 193, 252, 194, 252,
-    195, 252,
-    196, 252, 197, 252, 198, 252, 0, 2, 252, 0, 4, 252, 0, 6, 252, 20, 66,
-    248, 85, 250,
-    87, 249, 88, 249, 89, 250, 90, 249, 193, 248, 194, 248, 195, 248, 196,
-    248, 197,
-    248, 198, 248, 222, 249, 0, 2, 248, 0, 4, 248, 0, 6, 248, 0, 100, 250, 0,
-    102, 250,
-    0, 122, 249, 20, 66, 248, 85, 250, 87, 249, 88, 249, 89, 250, 90, 249,
-    193, 248, 194,
-    248, 195, 248, 196, 248, 197, 248, 198, 248, 222, 249, 0, 2, 248, 0, 4,
-    248, 0, 6,
-    248, 0, 100, 250, 0, 102, 250, 0, 122, 249, 20, 66, 248, 85, 250, 87, 249,
-    88, 249,
-    89, 250, 90, 249, 193, 248, 194, 248, 195, 248, 196, 248, 197, 248, 198,
-    248, 222,
-    249, 0, 2, 248, 0, 4, 248, 0, 6, 248, 0, 100, 250, 0, 102, 250, 0, 122,
-    249, 20, 66,
-    248, 85, 250, 87, 249, 88, 249, 89, 250, 90, 249, 193, 248, 194, 248, 195,
-    248, 196,
-    248, 197, 248, 198, 248, 222, 249, 0, 2, 248, 0, 4, 248, 0, 6, 248, 0,
-    100, 250, 0,
-    102, 250, 0, 122, 249, 20, 66, 248, 85, 250, 87, 249, 88, 249, 89, 250,
-    90, 249, 193,
-    248, 194, 248, 195, 248, 196, 248, 197, 248, 198, 248, 222, 249, 0, 2,
-    248, 0, 4,
-    248, 0, 6, 248, 0, 100, 250, 0, 102, 250, 0, 122, 249, 20, 66, 248, 85,
-    250, 87, 249,
-    88, 249, 89, 250, 90, 249, 193, 248, 194, 248, 195, 248, 196, 248, 197,
-    248, 198,
-    248, 222, 249, 0, 2, 248, 0, 4, 248, 0, 6, 248, 0, 100, 250, 0, 102, 250,
-    0, 122, 249,
-    13, 45, 253, 47, 253, 66, 250, 193, 250, 194, 250, 195, 250, 196, 250,
-    197, 250,
-    198, 250, 0, 2, 250, 0, 4, 250, 0, 6, 250, 13, 45, 253, 47, 253, 66, 250,
-    193, 250,
-    194, 250, 195, 250, 196, 250, 197, 250, 198, 250, 0, 2, 250, 0, 4, 250, 0,
-    6, 250,
-    13, 45, 253, 47, 253, 66, 250, 193, 250, 194, 250, 195, 250, 196, 250,
-    197, 250,
-    198, 250, 0, 2, 250, 0, 4, 250, 0, 6, 250, 13, 45, 253, 47, 253, 66, 250,
-    193, 250,
-    194, 250, 195, 250, 196, 250, 197, 250, 198, 250, 0, 2, 250, 0, 4, 250, 0,
-    6, 250,
-    69, 45, 242, 46, 245, 47, 242, 59, 246, 60, 246, 66, 249, 80, 254, 98,
-    242, 102, 242,
-    106, 245, 112, 242, 118, 242, 193, 249, 194, 249, 195, 249, 196, 249, 197,
-    249,
-    198, 249, 211, 254, 212, 254, 213, 254, 214, 254, 215, 254, 217, 254, 225,
-    242,
-    226, 242, 227, 242, 228, 242, 229, 242, 230, 242, 233, 248, 234, 242, 235,
-    242,
-    236, 248, 237, 251, 238, 245, 239, 251, 240, 251, 243, 242, 244, 242, 245,
-    242,
-    246, 242, 247, 242, 249, 242, 250, 242, 251, 242, 252, 242, 253, 242, 0,
-    2, 249,
-    0, 3, 242, 0, 4, 249, 0, 5, 242, 0, 6, 249, 0, 7, 242, 0, 21, 248, 0, 25,
-    242, 0, 27, 242,
-    0, 29, 242, 0, 45, 251, 0, 49, 245, 0, 78, 254, 0, 79, 242, 0, 82, 254, 0,
-    83, 242, 0,
-    109, 242, 0, 113, 242, 0, 115, 242, 0, 117, 242, 4, 104, 255, 0, 33, 255,
-    0, 37, 255,
-    4, 104, 255, 0, 33, 255, 0, 37, 255, 4, 104, 255, 0, 33, 255, 0, 37, 255,
-    4, 104, 255,
-    0, 33, 255, 0, 37, 255, 4, 104, 255, 0, 33, 255, 0, 37, 255, 4, 104, 255,
-    0, 33, 255,
-    0, 37, 255, 4, 105, 254, 108, 254, 0, 57, 254, 12, 45, 255, 47, 254, 104,
-    250, 119,
-    254, 120, 254, 121, 254, 122, 252, 254, 252, 0, 1, 252, 0, 33, 250, 0, 37,
-    250, 12,
-    45, 255, 47, 254, 104, 250, 119, 254, 120, 254, 121, 254, 122, 252, 254,
-    252, 0,
-    1, 252, 0, 33, 250, 0, 37, 250, 12, 45, 255, 47, 254, 104, 250, 119, 254,
-    120, 254,
-    121, 254, 122, 252, 254, 252, 0, 1, 252, 0, 33, 250, 0, 37, 250, 12, 45,
-    255, 47, 254,
-    104, 250, 119, 254, 120, 254, 121, 254, 122, 252, 254, 252, 0, 1, 252, 0,
-    33, 250,
-    0, 37, 250, 2, 119, 250, 5, 104, 255, 119, 255, 0, 33, 255, 0, 37, 255, 5,
-    104, 255,
-    119, 255, 0, 33, 255, 0, 37, 255, 5, 104, 255, 119, 255, 0, 33, 255, 0,
-    37, 255, 5,
-    104, 255, 119, 255, 0, 33, 255, 0, 37, 255, 5, 104, 255, 119, 255, 0, 33,
-    255, 0, 37,
-    255, 5, 104, 255, 119, 255, 0, 33, 255, 0, 37, 255, 3, 45, 248, 47, 248,
-    3, 45, 248,
-    47, 248, 50, 68, 252, 72, 251, 80, 250, 82, 250, 85, 251, 86, 249, 87,
-    239, 88, 241,
-    90, 248, 118, 254, 119, 248, 120, 248, 122, 248, 200, 252, 211, 250, 212,
-    250, 213,
-    250, 214, 250, 215, 250, 217, 250, 218, 249, 219, 249, 220, 249, 221, 249,
-    222,
-    248, 250, 254, 251, 254, 252, 254, 253, 254, 254, 248, 0, 1, 248, 0, 8,
-    252, 0, 14,
-    252, 0, 32, 251, 0, 36, 251, 0, 78, 250, 0, 82, 250, 0, 100, 251, 0, 102,
-    251, 0, 108,
-    249, 0, 109, 254, 0, 112, 249, 0, 113, 254, 0, 114, 249, 0, 115, 254, 0,
-    116, 249,
-    0, 117, 254, 0, 122, 248, 1, 32, 25, 251, 4, 104, 255, 0, 33, 255, 0, 37,
-    255, 50, 68,
-    252, 72, 251, 80, 250, 82, 250, 85, 251, 86, 249, 87, 239, 88, 241, 90,
-    248, 118,
-    254, 119, 248, 120, 248, 122, 248, 200, 252, 211, 250, 212, 250, 213, 250,
-    214,
-    250, 215, 250, 217, 250, 218, 249, 219, 249, 220, 249, 221, 249, 222, 248,
-    250,
-    254, 251, 254, 252, 254, 253, 254, 254, 248, 0, 1, 248, 0, 8, 252, 0, 14,
-    252, 0, 32,
-    251, 0, 36, 251, 0, 78, 250, 0, 82, 250, 0, 100, 251, 0, 102, 251, 0, 108,
-    249, 0, 109,
-    254, 0, 112, 249, 0, 113, 254, 0, 114, 249, 0, 115, 254, 0, 116, 249, 0,
-    117, 254,
-    0, 122, 248, 1, 32, 25, 251, 4, 104, 255, 0, 33, 255, 0, 37, 255, 50, 68,
-    252, 72, 251,
-    80, 250, 82, 250, 85, 251, 86, 249, 87, 239, 88, 241, 90, 248, 118, 254,
-    119, 248,
-    120, 248, 122, 248, 200, 252, 211, 250, 212, 250, 213, 250, 214, 250, 215,
-    250,
-    217, 250, 218, 249, 219, 249, 220, 249, 221, 249, 222, 248, 250, 254, 251,
-    254,
-    252, 254, 253, 254, 254, 248, 0, 1, 248, 0, 8, 252, 0, 14, 252, 0, 32,
-    251, 0, 36, 251,
-    0, 78, 250, 0, 82, 250, 0, 100, 251, 0, 102, 251, 0, 108, 249, 0, 109,
-    254, 0, 112,
-    249, 0, 113, 254, 0, 114, 249, 0, 115, 254, 0, 116, 249, 0, 117, 254, 0,
-    122, 248,
-    1, 32, 25, 251, 4, 104, 255, 0, 33, 255, 0, 37, 255, 4, 105, 254, 108,
-    254, 0, 57, 254,
-    4, 105, 254, 108, 254, 0, 57, 254, 16, 66, 251, 87, 250, 88, 250, 90, 250,
-    193, 251,
-    194, 251, 195, 251, 196, 251, 197, 251, 198, 251, 222, 250, 0, 2, 251, 0,
-    4, 251,
-    0, 6, 251, 0, 122, 250, 16, 66, 251, 87, 250, 88, 250, 90, 250, 193, 251,
-    194, 251,
-    195, 251, 196, 251, 197, 251, 198, 251, 222, 250, 0, 2, 251, 0, 4, 251, 0,
-    6, 251,
-    0, 122, 250, 12, 45, 255, 47, 254, 104, 250, 119, 254, 120, 254, 121, 254,
-    122, 252,
-    254, 252, 0, 1, 252, 0, 33, 250, 0, 37, 250, 12, 45, 255, 47, 254, 104,
-    250, 119, 254,
-    120, 254, 121, 254, 122, 252, 254, 252, 0, 1, 252, 0, 33, 250, 0, 37, 250,
-    12, 45,
-    255, 47, 254, 104, 250, 119, 254, 120, 254, 121, 254, 122, 252, 254, 252,
-    0, 1, 252,
-    0, 33, 250, 0, 37, 250, 12, 45, 255, 47, 254, 104, 250, 119, 254, 120,
-    254, 121, 254,
-    122, 252, 254, 252, 0, 1, 252, 0, 33, 250, 0, 37, 250, 15, 45, 255, 47,
-    254, 102, 255,
-    104, 255, 233, 255, 234, 255, 235, 255, 236, 255, 0, 21, 255, 0, 25, 255,
-    0, 27, 255,
-    0, 29, 255, 0, 33, 255, 0, 37, 255, 15, 45, 255, 47, 254, 102, 255, 104,
-    255, 233,
-    255, 234, 255, 235, 255, 236, 255, 0, 21, 255, 0, 25, 255, 0, 27, 255, 0,
-    29, 255,
-    0, 33, 255, 0, 37, 255, 40, 80, 249, 102, 251, 112, 250, 118, 250, 122,
-    250, 211,
-    249, 212, 249, 213, 249, 214, 249, 215, 249, 217, 249, 233, 251, 234, 251,
-    235,
-    251, 236, 251, 243, 250, 244, 250, 245, 250, 246, 250, 247, 250, 249, 250,
-    250,
-    250, 251, 250, 252, 250, 253, 250, 254, 250, 0, 1, 250, 0, 21, 251, 0, 25,
-    251, 0,
-    27, 251, 0, 29, 251, 0, 78, 249, 0, 79, 250, 0, 82, 249, 0, 83, 250, 0,
-    109, 250, 0,
-    113, 250, 0, 115, 250, 0, 117, 250, 22, 102, 255, 112, 255, 122, 255, 233,
-    255, 234,
-    255, 235, 255, 236, 255, 243, 255, 244, 255, 245, 255, 246, 255, 247, 255,
-    249,
-    255, 254, 255, 0, 1, 255, 0, 21, 255, 0, 25, 255, 0, 27, 255, 0, 29, 255,
-    0, 79, 255,
-    0, 83, 255, 13, 85, 254, 87, 248, 88, 248, 90, 254, 122, 252, 222, 254,
-    254, 252,
-    0, 1, 252, 0, 100, 254, 0, 102, 254, 0, 122, 254, 1, 32, 25, 251, 13, 85,
-    254, 87, 248,
-    88, 248, 90, 254, 122, 252, 222, 254, 254, 252, 0, 1, 252, 0, 100, 254, 0,
-    102, 254,
-    0, 122, 254, 1, 32, 25, 251, 13, 85, 254, 87, 248, 88, 248, 90, 254, 122,
-    252, 222,
-    254, 254, 252, 0, 1, 252, 0, 100, 254, 0, 102, 254, 0, 122, 254, 1, 32,
-    25, 251, 11,
-    66, 252, 193, 252, 194, 252, 195, 252, 196, 252, 197, 252, 198, 252, 0, 2,
-    252, 0,
-    4, 252, 0, 6, 252, 2, 119, 250, 11, 66, 252, 193, 252, 194, 252, 195, 252,
-    196, 252,
-    197, 252, 198, 252, 0, 2, 252, 0, 4, 252, 0, 6, 252, 2, 119, 250, 11, 66,
-    252, 193,
-    252, 194, 252, 195, 252, 196, 252, 197, 252, 198, 252, 0, 2, 252, 0, 4,
-    252, 0, 6,
-    252, 2, 119, 250, 20, 66, 248, 85, 250, 87, 249, 88, 249, 89, 250, 90,
-    249, 193, 248,
-    194, 248, 195, 248, 196, 248, 197, 248, 198, 248, 222, 249, 0, 2, 248, 0,
-    4, 248,
-    0, 6, 248, 0, 100, 250, 0, 102, 250, 0, 122, 249, 5, 104, 255, 119, 255,
-    0, 33, 255,
-    0, 37, 255, 20, 66, 248, 85, 250, 87, 249, 88, 249, 89, 250, 90, 249, 193,
-    248, 194,
-    248, 195, 248, 196, 248, 197, 248, 198, 248, 222, 249, 0, 2, 248, 0, 4,
-    248, 0, 6,
-    248, 0, 100, 250, 0, 102, 250, 0, 122, 249, 5, 104, 255, 119, 255, 0, 33,
-    255, 0, 37,
-    255, 24, 80, 250, 86, 250, 87, 254, 88, 254, 90, 254, 211, 250, 212, 250,
-    213, 250,
-    214, 250, 215, 250, 217, 250, 218, 250, 219, 250, 220, 250, 221, 250, 222,
-    254,
-    0, 78, 250, 0, 82, 250, 0, 108, 250, 0, 112, 250, 0, 114, 250, 0, 116,
-    250, 0, 122,
-    254, 47, 45, 238, 46, 254, 47, 238, 98, 254, 100, 251, 101, 251, 102, 251,
-    104, 251,
-    112, 249, 114, 251, 116, 255, 225, 254, 226, 254, 227, 254, 228, 254, 229,
-    254,
-    230, 254, 232, 251, 233, 251, 234, 251, 235, 251, 236, 251, 243, 249, 244,
-    249,
-    245, 249, 246, 249, 247, 249, 249, 249, 0, 3, 254, 0, 5, 254, 0, 7, 254,
-    0, 9, 251,
-    0, 15, 251, 0, 19, 251, 0, 21, 251, 0, 25, 251, 0, 27, 251, 0, 29, 251, 0,
-    33, 251, 0,
-    37, 251, 0, 79, 249, 0, 83, 249, 0, 93, 255, 0, 97, 255, 0, 99, 255, 1, 2,
-    25, 255, 24,
-    80, 250, 86, 250, 87, 254, 88, 254, 90, 254, 211, 250, 212, 250, 213, 250,
-    214, 250,
-    215, 250, 217, 250, 218, 250, 219, 250, 220, 250, 221, 250, 222, 254, 0,
-    78, 250,
-    0, 82, 250, 0, 108, 250, 0, 112, 250, 0, 114, 250, 0, 116, 250, 0, 122,
-    254, 47, 45,
-    238, 46, 254, 47, 238, 98, 254, 100, 251, 101, 251, 102, 251, 104, 251,
-    112, 249,
-    114, 251, 116, 255, 225, 254, 226, 254, 227, 254, 228, 254, 229, 254, 230,
-    254,
-    232, 251, 233, 251, 234, 251, 235, 251, 236, 251, 243, 249, 244, 249, 245,
-    249,
-    246, 249, 247, 249, 249, 249, 0, 3, 254, 0, 5, 254, 0, 7, 254, 0, 9, 251,
-    0, 15, 251,
-    0, 19, 251, 0, 21, 251, 0, 25, 251, 0, 27, 251, 0, 29, 251, 0, 33, 251, 0,
-    37, 251, 0,
-    79, 249, 0, 83, 249, 0, 93, 255, 0, 97, 255, 0, 99, 255, 1, 2, 25, 255,
-    24, 80, 250,
-    86, 250, 87, 254, 88, 254, 90, 254, 211, 250, 212, 250, 213, 250, 214,
-    250, 215,
-    250, 217, 250, 218, 250, 219, 250, 220, 250, 221, 250, 222, 254, 0, 78,
-    250, 0, 82,
-    250, 0, 108, 250, 0, 112, 250, 0, 114, 250, 0, 116, 250, 0, 122, 254, 47,
-    45, 238,
-    46, 254, 47, 238, 98, 254, 100, 251, 101, 251, 102, 251, 104, 251, 112,
-    249, 114,
-    251, 116, 255, 225, 254, 226, 254, 227, 254, 228, 254, 229, 254, 230, 254,
-    232,
-    251, 233, 251, 234, 251, 235, 251, 236, 251, 243, 249, 244, 249, 245, 249,
-    246,
-    249, 247, 249, 249, 249, 0, 3, 254, 0, 5, 254, 0, 7, 254, 0, 9, 251, 0,
-    15, 251, 0, 19,
-    251, 0, 21, 251, 0, 25, 251, 0, 27, 251, 0, 29, 251, 0, 33, 251, 0, 37,
-    251, 0, 79, 249,
-    0, 83, 249, 0, 93, 255, 0, 97, 255, 0, 99, 255, 1, 2, 25, 255, 73, 45,
-    245, 46, 245,
-    47, 245, 59, 248, 60, 246, 66, 249, 80, 254, 98, 242, 102, 242, 106, 248,
-    112, 242,
-    115, 248, 118, 248, 120, 245, 122, 245, 193, 249, 194, 249, 195, 249, 196,
-    249,
-    197, 249, 198, 249, 211, 254, 212, 254, 213, 254, 214, 254, 215, 254, 217,
-    254,
-    225, 242, 226, 242, 227, 242, 228, 242, 229, 242, 230, 242, 233, 248, 234,
-    242,
-    235, 248, 236, 248, 238, 248, 243, 242, 244, 242, 245, 242, 246, 242, 247,
-    242,
-    249, 242, 250, 248, 251, 248, 252, 248, 253, 248, 254, 245, 0, 1, 251, 0,
-    2, 249,
-    0, 3, 242, 0, 4, 249, 0, 5, 242, 0, 6, 249, 0, 7, 242, 0, 21, 248, 0, 25,
-    242, 0, 27, 242,
-    0, 29, 242, 0, 49, 248, 0, 78, 254, 0, 79, 242, 0, 82, 254, 0, 83, 242, 0,
-    87, 248, 0,
-    89, 248, 0, 91, 248, 0, 109, 248, 0, 113, 248, 0, 115, 248, 0, 117, 248,
-    73, 45, 245,
-    46, 245, 47, 245, 59, 248, 60, 246, 66, 249, 80, 254, 98, 242, 102, 242,
-    106, 248,
-    112, 242, 115, 248, 118, 248, 120, 245, 122, 245, 193, 249, 194, 249, 195,
-    249,
-    196, 249, 197, 249, 198, 249, 211, 254, 212, 254, 213, 254, 214, 254, 215,
-    254,
-    217, 254, 225, 242, 226, 242, 227, 242, 228, 242, 229, 242, 230, 242, 233,
-    248,
-    234, 242, 235, 248, 236, 248, 238, 248, 243, 242, 244, 242, 245, 242, 246,
-    242,
-    247, 242, 249, 242, 250, 248, 251, 248, 252, 248, 253, 248, 254, 245, 0,
-    1, 251,
-    0, 2, 249, 0, 3, 242, 0, 4, 249, 0, 5, 242, 0, 6, 249, 0, 7, 242, 0, 21,
-    248, 0, 25, 242,
-    0, 27, 242, 0, 29, 242, 0, 49, 248, 0, 78, 254, 0, 79, 242, 0, 82, 254, 0,
-    83, 242, 0,
-    87, 248, 0, 89, 248, 0, 91, 248, 0, 109, 248, 0, 113, 248, 0, 115, 248, 0,
-    117, 248,
-    13, 45, 253, 47, 253, 66, 250, 193, 250, 194, 250, 195, 250, 196, 250,
-    197, 250,
-    198, 250, 0, 2, 250, 0, 4, 250, 0, 6, 250, 13, 45, 253, 47, 253, 66, 250,
-    193, 250,
-    194, 250, 195, 250, 196, 250, 197, 250, 198, 250, 0, 2, 250, 0, 4, 250, 0,
-    6, 250,
-    13, 45, 253, 47, 253, 66, 250, 193, 250, 194, 250, 195, 250, 196, 250,
-    197, 250,
-    198, 250, 0, 2, 250, 0, 4, 250, 0, 6, 250, 13, 45, 253, 47, 253, 66, 250,
-    193, 250,
-    194, 250, 195, 250, 196, 250, 197, 250, 198, 250, 0, 2, 250, 0, 4, 250, 0,
-    6, 250,
-    69, 45, 242, 46, 245, 47, 242, 59, 246, 60, 246, 66, 249, 80, 254, 98,
-    242, 102, 242,
-    106, 245, 112, 242, 118, 242, 193, 249, 194, 249, 195, 249, 196, 249, 197,
-    249,
-    198, 249, 211, 254, 212, 254, 213, 254, 214, 254, 215, 254, 217, 254, 225,
-    242,
-    226, 242, 227, 242, 228, 242, 229, 242, 230, 242, 233, 248, 234, 242, 235,
-    242,
-    236, 248, 237, 251, 238, 245, 239, 251, 240, 251, 243, 242, 244, 242, 245,
-    242,
-    246, 242, 247, 242, 249, 242, 250, 242, 251, 242, 252, 242, 253, 242, 0,
-    2, 249,
-    0, 3, 242, 0, 4, 249, 0, 5, 242, 0, 6, 249, 0, 7, 242, 0, 21, 248, 0, 25,
-    242, 0, 27, 242,
-    0, 29, 242, 0, 45, 251, 0, 49, 245, 0, 78, 254, 0, 79, 242, 0, 82, 254, 0,
-    83, 242, 0,
-    109, 242, 0, 113, 242, 0, 115, 242, 0, 117, 242, 2, 1, 32, 24, 238, 17,
-    33, 238, 101,
-    253, 115, 253, 116, 250, 117, 252, 119, 255, 0, 19, 253, 0, 87, 253, 0,
-    89, 253, 0,
-    91, 253, 0, 93, 250, 0, 97, 250, 0, 99, 250, 0, 101, 252, 1, 2, 25, 250,
-    1, 32, 25, 238
-};
-static afm_cuint16 afm_Times_Italic_highchars_index[] = {   /* 220 */
-    161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176,
-    177,
-    178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192,
-    193,
-    194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208,
-    209,
-    210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224,
-    225,
-    226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240,
-    241,
-    242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256,
-    257,
-    258, 259, 260, 261, 262, 263, 268, 269, 270, 271, 272, 273, 274, 275, 278,
-    279,
-    280, 281, 282, 283, 286, 287, 290, 291, 298, 299, 302, 303, 304, 305, 310,
-    311,
-    313, 314, 315, 316, 317, 318, 321, 322, 323, 324, 325, 326, 327, 328, 332,
-    333,
-    336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 350, 351, 352,
-    353,
-    354, 355, 356, 357, 362, 363, 366, 367, 368, 369, 370, 371, 376, 377, 378,
-    379,
-    380, 381, 382, 402, 536, 537, 710, 711, 728, 729, 730, 731, 732, 733,
-    8211, 8212,
-    8216, 8217, 8218, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8249,
-    8250,
-    8260, 8364, 8482, 8706, 8710, 8721, 8722, 8730, 8800, 8804, 8805, 9674,
-    63171,
-    64257, 64258
-};
-static afm_cunicode afm_Times_Italic_ligatures[] = {    /* 3 */
-    102, 105, 64257
-};
-
-
-/* ------------------------------------------------------------------*/
-/* FontName: Times-Roman */
-/* FullName: Times Roman */
-/* FamilyName: Times */
-static afm_cuint8 afm_Times_Roman_widths[] = {  /* 315 */
-    42, 56, 68, 83, 83, 139, 130, 30, 56, 56, 83, 94, 42, 56, 42, 46, 83, 83,
-    83, 83, 83,
-    83, 83, 83, 83, 83, 46, 46, 94, 94, 94, 74, 154, 120, 111, 111, 120, 102,
-    93, 120,
-    120, 56, 65, 120, 102, 148, 120, 120, 93, 120, 111, 93, 102, 120, 120,
-    157, 120,
-    120, 102, 56, 46, 56, 78, 83, 56, 74, 83, 74, 83, 74, 56, 83, 83, 46, 46,
-    83, 46, 130,
-    83, 83, 83, 83, 56, 65, 46, 83, 83, 120, 83, 83, 74, 80, 33, 80, 90, 56,
-    83, 83, 83,
-    83, 33, 83, 56, 127, 46, 83, 94, 127, 56, 67, 94, 50, 50, 56, 83, 76, 42,
-    56, 50, 52,
-    83, 125, 125, 125, 74, 120, 120, 120, 120, 120, 120, 148, 111, 102, 102,
-    102, 102,
-    56, 56, 56, 56, 120, 120, 120, 120, 120, 120, 120, 94, 120, 120, 120, 120,
-    120, 120,
-    93, 83, 74, 74, 74, 74, 74, 74, 111, 74, 74, 74, 74, 74, 46, 46, 46, 46,
-    83, 83, 83,
-    83, 83, 83, 83, 94, 83, 83, 83, 83, 83, 83, 83, 83, 120, 74, 120, 74, 120,
-    74, 111,
-    74, 111, 74, 120, 98, 120, 83, 102, 74, 102, 74, 102, 74, 102, 74, 120,
-    83, 120, 83,
-    56, 46, 56, 46, 56, 46, 120, 83, 102, 46, 102, 46, 102, 57, 102, 46, 120,
-    83, 120,
-    83, 120, 83, 120, 83, 120, 83, 148, 120, 111, 56, 111, 56, 111, 56, 93,
-    65, 93, 65,
-    93, 65, 102, 46, 102, 54, 120, 83, 120, 83, 120, 83, 120, 83, 120, 102,
-    74, 102, 74,
-    102, 74, 83, 93, 65, 56, 56, 56, 56, 56, 56, 56, 56, 83, 167, 56, 56, 56,
-    74, 74, 74,
-    83, 83, 58, 167, 167, 56, 56, 28, 83, 163, 79, 102, 100, 94, 76, 92, 92,
-    92, 79, 42,
-    93, 93
-};
-static afm_sint16 afm_Times_Roman_kerning_index[] = {   /* 315 */
-    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0,
-    0, 0, 62, 159, 0, 205, 0, 240, 0, 0, 0, 311, 335, 427, 0, 458, 482, 527,
-    578, 601, 0,
-    663, 831, 855, 1020, 0, 1175, 0, 0, 0, 0, 0, 0, 0, 1323, 1328, 1355, 0,
-    1363, 1385,
-    0, 0, 1422, 0, 1425, 1475, 0, 1478, 1488, 1500, 0, 1508, 0, 0, 0, 1523,
-    1593, 1641,
-    1664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 1669, 1766, 1863, 1960, 2057, 2154, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 2251,
-    2275, 2320, 2365, 2410, 2455, 0, 2500, 2545, 2569, 2593, 2617, 2641, 0, 0,
-    2789,
-    2794, 2799, 2804, 2809, 2814, 0, 2819, 2827, 2849, 2871, 2893, 2915, 2918,
-    2921,
-    2924, 0, 2927, 2937, 2949, 2961, 2973, 2985, 0, 2997, 0, 0, 0, 0, 3009, 0,
-    3014,
-    3019, 3116, 3121, 3218, 3223, 3320, 0, 3325, 0, 3333, 3341, 0, 3376, 0, 0,
-    3411,
-    0, 3433, 0, 3455, 0, 3477, 0, 0, 0, 0, 0, 3499, 0, 3502, 0, 0, 3505, 3597,
-    3647, 3678,
-    3681, 3712, 3715, 0, 3727, 3758, 3761, 3785, 3795, 3819, 3829, 3853, 3863,
-    3908,
-    3920, 3965, 0, 0, 3977, 4039, 4054, 4116, 4131, 4193, 0, 0, 0, 0, 0, 0,
-    4208, 0, 4376,
-    0, 4544, 0, 4568, 0, 4592, 0, 4616, 0, 4640, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0,
-    0, 0, 0, 0, 4788, 4816, 0, 4872, 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 afm_cuint8 afm_Times_Roman_kerning_data[] = {    /* 4896 */
-    42, 19, 66, 248, 85, 254, 87, 249, 88, 252, 90, 242, 193, 248, 194, 248,
-    195, 248,
-    196, 248, 197, 248, 198, 248, 222, 242, 0, 2, 248, 0, 4, 248, 0, 6, 248,
-    0, 100, 254,
-    0, 102, 254, 0, 122, 242, 3, 1, 32, 25, 245, 1, 32, 29, 245, 3, 1, 32, 25,
-    245, 1, 32,
-    29, 245, 41, 68, 250, 72, 250, 80, 248, 82, 248, 85, 238, 86, 248, 87,
-    234, 88, 242,
-    90, 239, 119, 245, 120, 242, 122, 242, 200, 250, 211, 248, 212, 248, 213,
-    248, 214,
-    248, 215, 248, 217, 248, 218, 248, 219, 248, 220, 248, 221, 248, 222, 239,
-    254,
-    242, 0, 1, 242, 0, 8, 250, 0, 14, 250, 0, 32, 250, 0, 36, 250, 0, 78, 248,
-    0, 82, 248,
-    0, 100, 238, 0, 102, 238, 0, 108, 248, 0, 112, 248, 0, 114, 248, 0, 116,
-    248, 0, 122,
-    239, 1, 32, 25, 238, 20, 66, 251, 86, 255, 193, 251, 194, 251, 195, 251,
-    196, 251,
-    197, 251, 198, 251, 218, 255, 219, 255, 220, 255, 221, 255, 0, 2, 251, 0,
-    4, 251,
-    0, 6, 251, 0, 108, 255, 0, 112, 255, 0, 114, 255, 0, 116, 255, 16, 66,
-    250, 87, 250,
-    88, 252, 90, 248, 193, 250, 194, 250, 195, 250, 196, 250, 197, 250, 198,
-    250, 222,
-    248, 0, 2, 250, 0, 4, 250, 0, 6, 250, 0, 122, 248, 32, 45, 244, 47, 244,
-    66, 245, 98,
-    254, 112, 254, 193, 245, 194, 245, 195, 245, 196, 245, 197, 245, 198, 245,
-    225,
-    254, 226, 254, 227, 254, 228, 254, 229, 254, 230, 254, 243, 254, 244, 254,
-    245,
-    254, 246, 254, 247, 254, 249, 254, 0, 2, 245, 0, 3, 254, 0, 4, 245, 0, 5,
-    254, 0, 6,
-    245, 0, 7, 254, 0, 79, 254, 0, 83, 254, 11, 66, 247, 193, 247, 194, 247,
-    195, 247,
-    196, 247, 197, 247, 198, 247, 0, 2, 247, 0, 4, 247, 0, 6, 247, 40, 80,
-    252, 102, 253,
-    112, 251, 118, 254, 122, 253, 211, 252, 212, 252, 213, 252, 214, 252, 215,
-    252,
-    217, 252, 233, 253, 234, 253, 235, 253, 236, 253, 243, 251, 244, 251, 245,
-    251,
-    246, 251, 247, 251, 249, 251, 250, 254, 251, 254, 252, 254, 253, 254, 254,
-    253,
-    0, 1, 253, 0, 21, 253, 0, 25, 253, 0, 27, 253, 0, 29, 253, 0, 78, 252, 0,
-    79, 251, 0,
-    82, 252, 0, 83, 251, 0, 109, 254, 0, 113, 254, 0, 115, 254, 0, 117, 254,
-    13, 85, 242,
-    87, 240, 88, 245, 90, 240, 122, 248, 222, 240, 254, 248, 0, 1, 248, 0,
-    100, 242, 0,
-    102, 242, 0, 122, 240, 1, 32, 25, 242, 11, 66, 251, 193, 251, 194, 251,
-    195, 251,
-    196, 251, 197, 251, 198, 251, 0, 2, 251, 0, 4, 251, 0, 6, 251, 20, 66,
-    251, 85, 250,
-    87, 249, 88, 251, 89, 250, 90, 249, 193, 251, 194, 251, 195, 251, 196,
-    251, 197,
-    251, 198, 251, 222, 249, 0, 2, 251, 0, 4, 251, 0, 6, 251, 0, 100, 250, 0,
-    102, 250,
-    0, 122, 249, 23, 45, 238, 47, 238, 66, 242, 98, 254, 193, 242, 194, 242,
-    195, 242,
-    196, 242, 197, 242, 198, 242, 225, 254, 226, 254, 227, 254, 228, 254, 229,
-    254,
-    230, 254, 0, 2, 242, 0, 3, 254, 0, 4, 242, 0, 5, 254, 0, 6, 242, 0, 7,
-    254, 10, 86, 255,
-    218, 255, 219, 255, 220, 255, 221, 255, 0, 108, 255, 0, 112, 255, 0, 114,
-    255, 0,
-    116, 255, 27, 80, 250, 85, 247, 86, 250, 87, 244, 88, 248, 90, 246, 211,
-    250, 212,
-    250, 213, 250, 214, 250, 215, 250, 217, 250, 218, 250, 219, 250, 220, 250,
-    221,
-    250, 222, 246, 0, 78, 250, 0, 82, 250, 0, 100, 247, 0, 102, 247, 0, 108,
-    250, 0, 112,
-    250, 0, 114, 250, 0, 116, 250, 0, 122, 246, 73, 45, 245, 46, 242, 47, 245,
-    59, 249,
-    60, 248, 66, 241, 80, 254, 98, 244, 102, 245, 106, 251, 112, 244, 115,
-    251, 118,
-    249, 120, 244, 122, 244, 193, 241, 194, 241, 195, 241, 196, 241, 197, 241,
-    198,
-    241, 211, 254, 212, 254, 213, 254, 214, 254, 215, 254, 217, 254, 225, 250,
-    226,
-    244, 227, 244, 228, 250, 229, 250, 230, 244, 233, 245, 234, 245, 235, 245,
-    236,
-    252, 238, 251, 243, 244, 244, 244, 245, 244, 246, 244, 247, 244, 249, 244,
-    250,
-    249, 251, 249, 252, 249, 253, 249, 254, 244, 0, 1, 244, 0, 2, 241, 0, 3,
-    250, 0, 4,
-    241, 0, 5, 244, 0, 6, 241, 0, 7, 244, 0, 21, 252, 0, 25, 245, 0, 27, 245,
-    0, 29, 245,
-    0, 49, 251, 0, 78, 254, 0, 79, 244, 0, 82, 254, 0, 83, 244, 0, 87, 251, 0,
-    89, 251, 0,
-    91, 251, 0, 109, 249, 0, 113, 249, 0, 115, 249, 0, 117, 249, 11, 66, 250,
-    193, 250,
-    194, 250, 195, 250, 196, 250, 197, 250, 198, 250, 0, 2, 250, 0, 4, 250, 0,
-    6, 250,
-    72, 45, 235, 46, 240, 47, 235, 59, 245, 60, 245, 66, 234, 72, 254, 80,
-    250, 98, 238,
-    102, 238, 106, 247, 112, 235, 118, 244, 193, 234, 194, 234, 195, 234, 196,
-    234,
-    197, 234, 198, 234, 211, 250, 212, 250, 213, 250, 214, 250, 215, 250, 217,
-    250,
-    225, 245, 226, 238, 227, 245, 228, 245, 229, 245, 230, 238, 233, 245, 234,
-    238,
-    235, 245, 236, 245, 237, 254, 238, 247, 239, 254, 240, 254, 243, 242, 244,
-    235,
-    245, 235, 246, 242, 247, 242, 249, 235, 250, 244, 251, 244, 252, 244, 253,
-    244,
-    0, 2, 234, 0, 3, 245, 0, 4, 234, 0, 5, 238, 0, 6, 234, 0, 7, 238, 0, 21,
-    245, 0, 25, 238,
-    0, 27, 238, 0, 29, 245, 0, 32, 254, 0, 36, 254, 0, 45, 254, 0, 49, 247, 0,
-    78, 250, 0,
-    79, 242, 0, 82, 250, 0, 83, 235, 0, 109, 244, 0, 113, 244, 0, 115, 244, 0,
-    117, 244,
-    68, 45, 242, 46, 246, 47, 242, 59, 251, 60, 251, 66, 237, 80, 255, 98,
-    244, 102, 244,
-    106, 250, 112, 244, 118, 249, 122, 245, 193, 237, 194, 237, 195, 237, 196,
-    237,
-    197, 237, 198, 237, 211, 255, 212, 255, 213, 255, 214, 255, 215, 255, 217,
-    255,
-    225, 244, 226, 244, 227, 244, 228, 244, 229, 244, 230, 244, 233, 250, 234,
-    244,
-    235, 244, 236, 250, 238, 250, 243, 244, 244, 244, 245, 244, 246, 244, 247,
-    244,
-    249, 244, 250, 249, 251, 249, 252, 249, 253, 249, 254, 245, 0, 1, 245, 0,
-    2, 237,
-    0, 3, 244, 0, 4, 237, 0, 5, 244, 0, 6, 237, 0, 7, 244, 0, 21, 250, 0, 25,
-    244, 0, 27, 244,
-    0, 29, 244, 0, 49, 250, 0, 78, 255, 0, 79, 244, 0, 82, 255, 0, 83, 244, 0,
-    109, 249,
-    0, 113, 249, 0, 115, 249, 0, 117, 249, 65, 45, 235, 46, 238, 47, 235, 59,
-    242, 60,
-    242, 66, 237, 80, 252, 98, 240, 102, 240, 106, 248, 112, 239, 118, 238,
-    193, 237,
-    194, 237, 195, 237, 196, 237, 197, 237, 198, 237, 211, 252, 212, 252, 213,
-    252,
-    214, 252, 215, 252, 217, 252, 225, 247, 226, 240, 227, 240, 228, 247, 229,
-    247,
-    230, 240, 233, 247, 234, 240, 235, 240, 236, 247, 238, 248, 243, 245, 244,
-    239,
-    245, 239, 246, 245, 247, 245, 249, 239, 250, 245, 251, 238, 252, 238, 253,
-    245,
-    0, 2, 237, 0, 3, 247, 0, 4, 237, 0, 5, 240, 0, 6, 237, 0, 7, 240, 0, 21,
-    247, 0, 25, 240,
-    0, 27, 240, 0, 29, 240, 0, 49, 248, 0, 78, 252, 0, 79, 245, 0, 82, 252, 0,
-    83, 239, 0,
-    109, 245, 0, 113, 238, 0, 115, 238, 0, 117, 238, 3, 119, 254, 120, 254,
-    12, 47, 250,
-    118, 254, 119, 254, 250, 254, 251, 254, 252, 254, 253, 254, 0, 109, 254,
-    0, 113,
-    254, 0, 115, 254, 0, 117, 254, 4, 122, 254, 254, 254, 0, 1, 254, 10, 104,
-    254, 119,
-    253, 120, 253, 121, 254, 122, 254, 254, 254, 0, 1, 254, 0, 33, 254, 0, 37,
-    254, 16,
-    98, 255, 103, 253, 106, 254, 225, 255, 226, 255, 227, 255, 228, 255, 229,
-    255, 230,
-    255, 238, 254, 0, 3, 255, 0, 5, 255, 0, 7, 255, 0, 51, 249, 1, 32, 25, 9,
-    2, 119, 253,
-    22, 102, 255, 112, 255, 122, 254, 233, 255, 234, 255, 235, 255, 236, 255,
-    243, 255,
-    244, 255, 245, 255, 246, 255, 247, 255, 249, 255, 254, 254, 0, 1, 254, 0,
-    21, 255,
-    0, 25, 255, 0, 27, 255, 0, 29, 255, 0, 79, 255, 0, 83, 255, 2, 120, 255,
-    5, 119, 250,
-    122, 254, 254, 254, 0, 1, 254, 6, 119, 254, 120, 253, 122, 255, 254, 255,
-    0, 1, 255,
-    4, 122, 255, 254, 255, 0, 1, 255, 7, 45, 250, 46, 254, 47, 248, 104, 254,
-    0, 33, 254,
-    0, 37, 254, 31, 45, 246, 47, 246, 98, 253, 102, 254, 112, 254, 225, 253,
-    226, 253,
-    227, 253, 228, 253, 229, 253, 230, 253, 233, 254, 234, 254, 235, 254, 236,
-    254,
-    243, 254, 244, 254, 245, 254, 246, 254, 247, 254, 249, 254, 0, 3, 253, 0,
-    5, 253,
-    0, 7, 253, 0, 21, 254, 0, 25, 254, 0, 27, 254, 0, 29, 254, 0, 79, 254, 0,
-    83, 254, 22,
-    45, 246, 47, 246, 98, 255, 112, 255, 225, 255, 226, 255, 227, 255, 228,
-    255, 229,
-    255, 230, 255, 243, 255, 244, 255, 245, 255, 246, 255, 247, 255, 249, 255,
-    0, 3,
-    255, 0, 5, 255, 0, 7, 255, 0, 79, 255, 0, 83, 255, 10, 102, 254, 233, 254,
-    234, 254,
-    235, 254, 236, 254, 0, 21, 254, 0, 25, 254, 0, 27, 254, 0, 29, 254, 3, 45,
-    246, 47,
-    246, 41, 68, 250, 72, 250, 80, 248, 82, 248, 85, 238, 86, 248, 87, 234,
-    88, 242, 90,
-    239, 119, 245, 120, 242, 122, 242, 200, 250, 211, 248, 212, 248, 213, 248,
-    214,
-    248, 215, 248, 217, 248, 218, 248, 219, 248, 220, 248, 221, 248, 222, 239,
-    254,
-    242, 0, 1, 242, 0, 8, 250, 0, 14, 250, 0, 32, 250, 0, 36, 250, 0, 78, 248,
-    0, 82, 248,
-    0, 100, 238, 0, 102, 238, 0, 108, 248, 0, 112, 248, 0, 114, 248, 0, 116,
-    248, 0, 122,
-    239, 1, 32, 25, 238, 41, 68, 250, 72, 250, 80, 248, 82, 248, 85, 238, 86,
-    248, 87,
-    234, 88, 242, 90, 239, 119, 245, 120, 242, 122, 242, 200, 250, 211, 248,
-    212, 248,
-    213, 248, 214, 248, 215, 248, 217, 248, 218, 248, 219, 248, 220, 248, 221,
-    248,
-    222, 239, 254, 242, 0, 1, 242, 0, 8, 250, 0, 14, 250, 0, 32, 250, 0, 36,
-    250, 0, 78,
-    248, 0, 82, 248, 0, 100, 238, 0, 102, 238, 0, 108, 248, 0, 112, 248, 0,
-    114, 248, 0,
-    116, 248, 0, 122, 239, 1, 32, 25, 238, 41, 68, 250, 72, 250, 80, 248, 82,
-    248, 85,
-    238, 86, 248, 87, 234, 88, 242, 90, 239, 119, 245, 120, 242, 122, 242,
-    200, 250,
-    211, 248, 212, 248, 213, 248, 214, 248, 215, 248, 217, 248, 218, 248, 219,
-    248,
-    220, 248, 221, 248, 222, 239, 254, 242, 0, 1, 242, 0, 8, 250, 0, 14, 250,
-    0, 32, 250,
-    0, 36, 250, 0, 78, 248, 0, 82, 248, 0, 100, 238, 0, 102, 238, 0, 108, 248,
-    0, 112, 248,
-    0, 114, 248, 0, 116, 248, 0, 122, 239, 1, 32, 25, 238, 41, 68, 250, 72,
-    250, 80, 248,
-    82, 248, 85, 238, 86, 248, 87, 234, 88, 242, 90, 239, 119, 245, 120, 242,
-    122, 242,
-    200, 250, 211, 248, 212, 248, 213, 248, 214, 248, 215, 248, 217, 248, 218,
-    248,
-    219, 248, 220, 248, 221, 248, 222, 239, 254, 242, 0, 1, 242, 0, 8, 250, 0,
-    14, 250,
-    0, 32, 250, 0, 36, 250, 0, 78, 248, 0, 82, 248, 0, 100, 238, 0, 102, 238,
-    0, 108, 248,
-    0, 112, 248, 0, 114, 248, 0, 116, 248, 0, 122, 239, 1, 32, 25, 238, 41,
-    68, 250, 72,
-    250, 80, 248, 82, 248, 85, 238, 86, 248, 87, 234, 88, 242, 90, 239, 119,
-    245, 120,
-    242, 122, 242, 200, 250, 211, 248, 212, 248, 213, 248, 214, 248, 215, 248,
-    217,
-    248, 218, 248, 219, 248, 220, 248, 221, 248, 222, 239, 254, 242, 0, 1,
-    242, 0, 8,
-    250, 0, 14, 250, 0, 32, 250, 0, 36, 250, 0, 78, 248, 0, 82, 248, 0, 100,
-    238, 0, 102,
-    238, 0, 108, 248, 0, 112, 248, 0, 114, 248, 0, 116, 248, 0, 122, 239, 1,
-    32, 25, 238,
-    41, 68, 250, 72, 250, 80, 248, 82, 248, 85, 238, 86, 248, 87, 234, 88,
-    242, 90, 239,
-    119, 245, 120, 242, 122, 242, 200, 250, 211, 248, 212, 248, 213, 248, 214,
-    248,
-    215, 248, 217, 248, 218, 248, 219, 248, 220, 248, 221, 248, 222, 239, 254,
-    242,
-    0, 1, 242, 0, 8, 250, 0, 14, 250, 0, 32, 250, 0, 36, 250, 0, 78, 248, 0,
-    82, 248, 0, 100,
-    238, 0, 102, 238, 0, 108, 248, 0, 112, 248, 0, 114, 248, 0, 116, 248, 0,
-    122, 239,
-    1, 32, 25, 238, 11, 66, 251, 193, 251, 194, 251, 195, 251, 196, 251, 197,
-    251, 198,
-    251, 0, 2, 251, 0, 4, 251, 0, 6, 251, 20, 66, 251, 85, 250, 87, 249, 88,
-    251, 89, 250,
-    90, 249, 193, 251, 194, 251, 195, 251, 196, 251, 197, 251, 198, 251, 222,
-    249, 0,
-    2, 251, 0, 4, 251, 0, 6, 251, 0, 100, 250, 0, 102, 250, 0, 122, 249, 20,
-    66, 251, 85,
-    250, 87, 249, 88, 251, 89, 250, 90, 249, 193, 251, 194, 251, 195, 251,
-    196, 251,
-    197, 251, 198, 251, 222, 249, 0, 2, 251, 0, 4, 251, 0, 6, 251, 0, 100,
-    250, 0, 102,
-    250, 0, 122, 249, 20, 66, 251, 85, 250, 87, 249, 88, 251, 89, 250, 90,
-    249, 193, 251,
-    194, 251, 195, 251, 196, 251, 197, 251, 198, 251, 222, 249, 0, 2, 251, 0,
-    4, 251,
-    0, 6, 251, 0, 100, 250, 0, 102, 250, 0, 122, 249, 20, 66, 251, 85, 250,
-    87, 249, 88,
-    251, 89, 250, 90, 249, 193, 251, 194, 251, 195, 251, 196, 251, 197, 251,
-    198, 251,
-    222, 249, 0, 2, 251, 0, 4, 251, 0, 6, 251, 0, 100, 250, 0, 102, 250, 0,
-    122, 249, 20,
-    66, 251, 85, 250, 87, 249, 88, 251, 89, 250, 90, 249, 193, 251, 194, 251,
-    195, 251,
-    196, 251, 197, 251, 198, 251, 222, 249, 0, 2, 251, 0, 4, 251, 0, 6, 251,
-    0, 100, 250,
-    0, 102, 250, 0, 122, 249, 20, 66, 251, 85, 250, 87, 249, 88, 251, 89, 250,
-    90, 249,
-    193, 251, 194, 251, 195, 251, 196, 251, 197, 251, 198, 251, 222, 249, 0,
-    2, 251,
-    0, 4, 251, 0, 6, 251, 0, 100, 250, 0, 102, 250, 0, 122, 249, 11, 66, 250,
-    193, 250,
-    194, 250, 195, 250, 196, 250, 197, 250, 198, 250, 0, 2, 250, 0, 4, 250, 0,
-    6, 250,
-    11, 66, 250, 193, 250, 194, 250, 195, 250, 196, 250, 197, 250, 198, 250,
-    0, 2, 250,
-    0, 4, 250, 0, 6, 250, 11, 66, 250, 193, 250, 194, 250, 195, 250, 196, 250,
-    197, 250,
-    198, 250, 0, 2, 250, 0, 4, 250, 0, 6, 250, 11, 66, 250, 193, 250, 194,
-    250, 195, 250,
-    196, 250, 197, 250, 198, 250, 0, 2, 250, 0, 4, 250, 0, 6, 250, 65, 45,
-    235, 46, 238,
-    47, 235, 59, 242, 60, 242, 66, 237, 80, 252, 98, 240, 102, 240, 106, 248,
-    112, 239,
-    118, 238, 193, 237, 194, 237, 195, 237, 196, 237, 197, 237, 198, 237, 211,
-    252,
-    212, 252, 213, 252, 214, 252, 215, 252, 217, 252, 225, 247, 226, 240, 227,
-    240,
-    228, 247, 229, 247, 230, 240, 233, 247, 234, 240, 235, 240, 236, 247, 238,
-    248,
-    243, 245, 244, 239, 245, 239, 246, 245, 247, 245, 249, 239, 250, 245, 251,
-    238,
-    252, 238, 253, 245, 0, 2, 237, 0, 3, 247, 0, 4, 237, 0, 5, 240, 0, 6, 237,
-    0, 7, 240,
-    0, 21, 247, 0, 25, 240, 0, 27, 240, 0, 29, 240, 0, 49, 248, 0, 78, 252, 0,
-    79, 245, 0,
-    82, 252, 0, 83, 239, 0, 109, 245, 0, 113, 238, 0, 115, 238, 0, 117, 238,
-    3, 119, 254,
-    120, 254, 3, 119, 254, 120, 254, 3, 119, 254, 120, 254, 3, 119, 254, 120,
-    254, 3,
-    119, 254, 120, 254, 3, 119, 254, 120, 254, 4, 122, 254, 254, 254, 0, 1,
-    254, 10, 104,
-    254, 119, 253, 120, 253, 121, 254, 122, 254, 254, 254, 0, 1, 254, 0, 33,
-    254, 0, 37,
-    254, 10, 104, 254, 119, 253, 120, 253, 121, 254, 122, 254, 254, 254, 0, 1,
-    254, 0,
-    33, 254, 0, 37, 254, 10, 104, 254, 119, 253, 120, 253, 121, 254, 122, 254,
-    254, 254,
-    0, 1, 254, 0, 33, 254, 0, 37, 254, 10, 104, 254, 119, 253, 120, 253, 121,
-    254, 122,
-    254, 254, 254, 0, 1, 254, 0, 33, 254, 0, 37, 254, 2, 119, 253, 2, 119,
-    253, 2, 119,
-    253, 2, 119, 253, 5, 119, 250, 122, 254, 254, 254, 0, 1, 254, 6, 119, 254,
-    120, 253,
-    122, 255, 254, 255, 0, 1, 255, 6, 119, 254, 120, 253, 122, 255, 254, 255,
-    0, 1, 255,
-    6, 119, 254, 120, 253, 122, 255, 254, 255, 0, 1, 255, 6, 119, 254, 120,
-    253, 122,
-    255, 254, 255, 0, 1, 255, 6, 119, 254, 120, 253, 122, 255, 254, 255, 0, 1,
-    255, 6,
-    119, 254, 120, 253, 122, 255, 254, 255, 0, 1, 255, 3, 45, 246, 47, 246, 3,
-    45, 246,
-    47, 246, 41, 68, 250, 72, 250, 80, 248, 82, 248, 85, 238, 86, 248, 87,
-    234, 88, 242,
-    90, 239, 119, 245, 120, 242, 122, 242, 200, 250, 211, 248, 212, 248, 213,
-    248, 214,
-    248, 215, 248, 217, 248, 218, 248, 219, 248, 220, 248, 221, 248, 222, 239,
-    254,
-    242, 0, 1, 242, 0, 8, 250, 0, 14, 250, 0, 32, 250, 0, 36, 250, 0, 78, 248,
-    0, 82, 248,
-    0, 100, 238, 0, 102, 238, 0, 108, 248, 0, 112, 248, 0, 114, 248, 0, 116,
-    248, 0, 122,
-    239, 1, 32, 25, 238, 3, 119, 254, 120, 254, 41, 68, 250, 72, 250, 80, 248,
-    82, 248,
-    85, 238, 86, 248, 87, 234, 88, 242, 90, 239, 119, 245, 120, 242, 122, 242,
-    200, 250,
-    211, 248, 212, 248, 213, 248, 214, 248, 215, 248, 217, 248, 218, 248, 219,
-    248,
-    220, 248, 221, 248, 222, 239, 254, 242, 0, 1, 242, 0, 8, 250, 0, 14, 250,
-    0, 32, 250,
-    0, 36, 250, 0, 78, 248, 0, 82, 248, 0, 100, 238, 0, 102, 238, 0, 108, 248,
-    0, 112, 248,
-    0, 114, 248, 0, 116, 248, 0, 122, 239, 1, 32, 25, 238, 3, 119, 254, 120,
-    254, 41, 68,
-    250, 72, 250, 80, 248, 82, 248, 85, 238, 86, 248, 87, 234, 88, 242, 90,
-    239, 119,
-    245, 120, 248, 122, 248, 200, 250, 211, 248, 212, 248, 213, 248, 214, 248,
-    215,
-    248, 217, 248, 218, 248, 219, 248, 220, 248, 221, 248, 222, 239, 254, 248,
-    0, 1,
-    248, 0, 8, 250, 0, 14, 250, 0, 32, 250, 0, 36, 250, 0, 78, 248, 0, 82,
-    248, 0, 100, 238,
-    0, 102, 238, 0, 108, 248, 0, 112, 248, 0, 114, 248, 0, 116, 248, 0, 122,
-    239, 1, 32,
-    25, 238, 3, 119, 254, 120, 254, 4, 122, 254, 254, 254, 0, 1, 254, 4, 122,
-    254, 254,
-    254, 0, 1, 254, 16, 66, 250, 87, 250, 88, 252, 90, 248, 193, 250, 194,
-    250, 195, 250,
-    196, 250, 197, 250, 198, 250, 222, 248, 0, 2, 250, 0, 4, 250, 0, 6, 250,
-    0, 122, 248,
-    16, 66, 250, 87, 250, 88, 252, 90, 248, 193, 250, 194, 250, 195, 250, 196,
-    250, 197,
-    250, 198, 250, 222, 248, 0, 2, 250, 0, 4, 250, 0, 6, 250, 0, 122, 248, 10,
-    104, 254,
-    119, 253, 120, 253, 121, 254, 122, 254, 254, 254, 0, 1, 254, 0, 33, 254,
-    0, 37, 254,
-    10, 104, 254, 119, 253, 120, 253, 121, 254, 122, 254, 254, 254, 0, 1, 254,
-    0, 33,
-    254, 0, 37, 254, 10, 104, 254, 119, 253, 120, 253, 121, 254, 122, 254,
-    254, 254,
-    0, 1, 254, 0, 33, 254, 0, 37, 254, 10, 104, 254, 119, 253, 120, 253, 121,
-    254, 122,
-    254, 254, 254, 0, 1, 254, 0, 33, 254, 0, 37, 254, 2, 119, 253, 2, 119,
-    253, 40, 80,
-    252, 102, 253, 112, 251, 118, 254, 122, 253, 211, 252, 212, 252, 213, 252,
-    214,
-    252, 215, 252, 217, 252, 233, 253, 234, 253, 235, 253, 236, 253, 243, 251,
-    244,
-    251, 245, 251, 246, 251, 247, 251, 249, 251, 250, 254, 251, 254, 252, 254,
-    253,
-    254, 254, 253, 0, 1, 253, 0, 21, 253, 0, 25, 253, 0, 27, 253, 0, 29, 253,
-    0, 78, 252,
-    0, 79, 251, 0, 82, 252, 0, 83, 251, 0, 109, 254, 0, 113, 254, 0, 115, 254,
-    0, 117, 254,
-    22, 102, 255, 112, 255, 122, 254, 233, 255, 234, 255, 235, 255, 236, 255,
-    243, 255,
-    244, 255, 245, 255, 246, 255, 247, 255, 249, 255, 254, 254, 0, 1, 254, 0,
-    21, 255,
-    0, 25, 255, 0, 27, 255, 0, 29, 255, 0, 79, 255, 0, 83, 255, 13, 85, 242,
-    87, 240, 88,
-    245, 90, 240, 122, 248, 222, 240, 254, 248, 0, 1, 248, 0, 100, 242, 0,
-    102, 242, 0,
-    122, 240, 1, 32, 25, 242, 2, 120, 255, 13, 85, 242, 87, 240, 88, 245, 90,
-    240, 122,
-    248, 222, 240, 254, 248, 0, 1, 248, 0, 100, 242, 0, 102, 242, 0, 122, 240,
-    1, 32, 25,
-    242, 2, 120, 255, 5, 122, 248, 254, 248, 0, 1, 248, 1, 32, 25, 242, 13,
-    85, 242, 87,
-    240, 88, 245, 90, 240, 122, 248, 222, 240, 254, 248, 0, 1, 248, 0, 100,
-    242, 0, 102,
-    242, 0, 122, 240, 1, 32, 25, 242, 2, 120, 255, 11, 66, 251, 193, 251, 194,
-    251, 195,
-    251, 196, 251, 197, 251, 198, 251, 0, 2, 251, 0, 4, 251, 0, 6, 251, 5,
-    119, 250, 122,
-    254, 254, 254, 0, 1, 254, 11, 66, 251, 193, 251, 194, 251, 195, 251, 196,
-    251, 197,
-    251, 198, 251, 0, 2, 251, 0, 4, 251, 0, 6, 251, 5, 119, 250, 122, 254,
-    254, 254, 0,
-    1, 254, 11, 66, 251, 193, 251, 194, 251, 195, 251, 196, 251, 197, 251,
-    198, 251,
-    0, 2, 251, 0, 4, 251, 0, 6, 251, 5, 119, 250, 122, 254, 254, 254, 0, 1,
-    254, 20, 66,
-    251, 85, 250, 87, 249, 88, 251, 89, 250, 90, 249, 193, 251, 194, 251, 195,
-    251, 196,
-    251, 197, 251, 198, 251, 222, 249, 0, 2, 251, 0, 4, 251, 0, 6, 251, 0,
-    100, 250, 0,
-    102, 250, 0, 122, 249, 6, 119, 254, 120, 253, 122, 255, 254, 255, 0, 1,
-    255, 20, 66,
-    251, 85, 250, 87, 249, 88, 251, 89, 250, 90, 249, 193, 251, 194, 251, 195,
-    251, 196,
-    251, 197, 251, 198, 251, 222, 249, 0, 2, 251, 0, 4, 251, 0, 6, 251, 0,
-    100, 250, 0,
-    102, 250, 0, 122, 249, 6, 119, 254, 120, 253, 122, 255, 254, 255, 0, 1,
-    255, 27, 80,
-    250, 85, 247, 86, 250, 87, 244, 88, 248, 90, 246, 211, 250, 212, 250, 213,
-    250, 214,
-    250, 215, 250, 217, 250, 218, 250, 219, 250, 220, 250, 221, 250, 222, 246,
-    0, 78,
-    250, 0, 82, 250, 0, 100, 247, 0, 102, 247, 0, 108, 250, 0, 112, 250, 0,
-    114, 250, 0,
-    116, 250, 0, 122, 246, 7, 45, 250, 46, 254, 47, 248, 104, 254, 0, 33, 254,
-    0, 37, 254,
-    27, 80, 250, 85, 247, 86, 250, 87, 244, 88, 248, 90, 246, 211, 250, 212,
-    250, 213,
-    250, 214, 250, 215, 250, 217, 250, 218, 250, 219, 250, 220, 250, 221, 250,
-    222,
-    246, 0, 78, 250, 0, 82, 250, 0, 100, 247, 0, 102, 247, 0, 108, 250, 0,
-    112, 250, 0,
-    114, 250, 0, 116, 250, 0, 122, 246, 7, 45, 250, 46, 254, 47, 248, 104,
-    254, 0, 33,
-    254, 0, 37, 254, 27, 80, 250, 85, 247, 86, 250, 87, 244, 88, 248, 90, 246,
-    211, 250,
-    212, 250, 213, 250, 214, 250, 215, 250, 217, 250, 218, 250, 219, 250, 220,
-    250,
-    221, 250, 222, 246, 0, 78, 250, 0, 82, 250, 0, 100, 247, 0, 102, 247, 0,
-    108, 250,
-    0, 112, 250, 0, 114, 250, 0, 116, 250, 0, 122, 246, 7, 45, 250, 46, 254,
-    47, 248, 104,
-    254, 0, 33, 254, 0, 37, 254, 73, 45, 245, 46, 242, 47, 245, 59, 249, 60,
-    248, 66, 241,
-    80, 254, 98, 244, 102, 245, 106, 251, 112, 244, 115, 251, 118, 249, 120,
-    244, 122,
-    244, 193, 241, 194, 241, 195, 241, 196, 241, 197, 241, 198, 241, 211, 254,
-    212,
-    254, 213, 254, 214, 254, 215, 254, 217, 254, 225, 250, 226, 244, 227, 244,
-    228,
-    250, 229, 250, 230, 244, 233, 252, 234, 245, 235, 252, 236, 252, 238, 251,
-    243,
-    244, 244, 244, 245, 244, 246, 244, 247, 244, 249, 244, 250, 249, 251, 249,
-    252,
-    249, 253, 249, 254, 244, 0, 1, 244, 0, 2, 241, 0, 3, 250, 0, 4, 241, 0, 5,
-    244, 0, 6,
-    241, 0, 7, 244, 0, 21, 245, 0, 25, 245, 0, 27, 245, 0, 29, 245, 0, 49,
-    251, 0, 78, 254,
-    0, 79, 244, 0, 82, 254, 0, 83, 244, 0, 87, 251, 0, 89, 251, 0, 91, 251, 0,
-    109, 249,
-    0, 113, 249, 0, 115, 249, 0, 117, 249, 73, 45, 245, 46, 242, 47, 245, 59,
-    249, 60,
-    248, 66, 241, 80, 254, 98, 244, 102, 245, 106, 251, 112, 244, 115, 251,
-    118, 249,
-    120, 244, 122, 244, 193, 241, 194, 241, 195, 241, 196, 241, 197, 241, 198,
-    241,
-    211, 254, 212, 254, 213, 254, 214, 254, 215, 254, 217, 254, 225, 250, 226,
-    244,
-    227, 244, 228, 250, 229, 250, 230, 244, 233, 245, 234, 245, 235, 252, 236,
-    252,
-    238, 251, 243, 244, 244, 244, 245, 244, 246, 244, 247, 244, 249, 244, 250,
-    249,
-    251, 249, 252, 249, 253, 249, 254, 244, 0, 1, 244, 0, 2, 241, 0, 3, 250,
-    0, 4, 241,
-    0, 5, 244, 0, 6, 241, 0, 7, 244, 0, 21, 252, 0, 25, 245, 0, 27, 245, 0,
-    29, 245, 0, 49,
-    251, 0, 78, 254, 0, 79, 244, 0, 82, 254, 0, 83, 244, 0, 87, 251, 0, 89,
-    251, 0, 91, 251,
-    0, 109, 249, 0, 113, 249, 0, 115, 249, 0, 117, 249, 11, 66, 250, 193, 250,
-    194, 250,
-    195, 250, 196, 250, 197, 250, 198, 250, 0, 2, 250, 0, 4, 250, 0, 6, 250,
-    11, 66, 250,
-    193, 250, 194, 250, 195, 250, 196, 250, 197, 250, 198, 250, 0, 2, 250, 0,
-    4, 250,
-    0, 6, 250, 11, 66, 250, 193, 250, 194, 250, 195, 250, 196, 250, 197, 250,
-    198, 250,
-    0, 2, 250, 0, 4, 250, 0, 6, 250, 11, 66, 250, 193, 250, 194, 250, 195,
-    250, 196, 250,
-    197, 250, 198, 250, 0, 2, 250, 0, 4, 250, 0, 6, 250, 65, 45, 235, 46, 238,
-    47, 235,
-    59, 242, 60, 242, 66, 237, 80, 252, 98, 240, 102, 240, 106, 248, 112, 239,
-    118, 238,
-    193, 237, 194, 237, 195, 237, 196, 237, 197, 237, 198, 237, 211, 252, 212,
-    252,
-    213, 252, 214, 252, 215, 252, 217, 252, 225, 247, 226, 240, 227, 240, 228,
-    240,
-    229, 247, 230, 240, 233, 247, 234, 240, 235, 240, 236, 247, 238, 248, 243,
-    245,
-    244, 239, 245, 239, 246, 245, 247, 245, 249, 239, 250, 245, 251, 238, 252,
-    238,
-    253, 245, 0, 2, 237, 0, 3, 247, 0, 4, 237, 0, 5, 240, 0, 6, 237, 0, 7,
-    240, 0, 21, 247,
-    0, 25, 240, 0, 27, 240, 0, 29, 240, 0, 49, 248, 0, 78, 252, 0, 79, 245, 0,
-    82, 252, 0,
-    83, 239, 0, 109, 245, 0, 113, 238, 0, 115, 238, 0, 117, 238, 12, 66, 244,
-    193, 244,
-    194, 244, 195, 244, 196, 244, 197, 244, 198, 244, 0, 2, 244, 0, 4, 244, 0,
-    6, 244,
-    1, 32, 24, 245, 21, 33, 245, 101, 249, 109, 255, 115, 249, 116, 248, 117,
-    254, 119,
-    249, 0, 19, 249, 0, 60, 255, 0, 62, 255, 0, 68, 255, 0, 87, 249, 0, 89,
-    249, 0, 91, 249,
-    0, 93, 248, 0, 97, 248, 0, 99, 248, 0, 101, 254, 1, 2, 25, 248, 1, 32, 25,
-    245, 11, 66,
-    244, 193, 244, 194, 244, 195, 244, 196, 244, 197, 244, 198, 244, 0, 2,
-    244, 0, 4,
-    244, 0, 6, 244
-};
-static afm_cuint16 afm_Times_Roman_highchars_index[] = {    /* 220 */
-    161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176,
-    177,
-    178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192,
-    193,
-    194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208,
-    209,
-    210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224,
-    225,
-    226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240,
-    241,
-    242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256,
-    257,
-    258, 259, 260, 261, 262, 263, 268, 269, 270, 271, 272, 273, 274, 275, 278,
-    279,
-    280, 281, 282, 283, 286, 287, 290, 291, 298, 299, 302, 303, 304, 305, 310,
-    311,
-    313, 314, 315, 316, 317, 318, 321, 322, 323, 324, 325, 326, 327, 328, 332,
-    333,
-    336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 350, 351, 352,
-    353,
-    354, 355, 356, 357, 362, 363, 366, 367, 368, 369, 370, 371, 376, 377, 378,
-    379,
-    380, 381, 382, 402, 536, 537, 710, 711, 728, 729, 730, 731, 732, 733,
-    8211, 8212,
-    8216, 8217, 8218, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8249,
-    8250,
-    8260, 8364, 8482, 8706, 8710, 8721, 8722, 8730, 8800, 8804, 8805, 9674,
-    63171,
-    64257, 64258
-};
-static afm_cunicode afm_Times_Roman_ligatures[] = { /* 3 */
-    102, 105, 64257
-};
-const afm_fontinfo afm_fontinfolist[] = {
-    {                   /* Courier.afm   761 bytes */
-     "Courier", "Courier",
-     629, -157,
-     afm_Courier_widths,
-     NULL,
-     NULL,
-     afm_Courier_highchars_index, 220,
-     afm_Courier_ligatures, 1},
-    {                   /* Courier-Bold.afm   761 bytes */
-     "Courier-Bold", "Courier Bold",
-     629, -157,
-     afm_Courier_Bold_widths,
-     NULL,
-     NULL,
-     afm_Courier_Bold_highchars_index, 220,
-     afm_Courier_Bold_ligatures, 1},
-    {                   /* Courier-BoldOblique.afm   761 bytes */
-     "Courier-BoldOblique", "Courier Bold Oblique",
-     629, -157,
-     afm_Courier_BoldOblique_widths,
-     NULL,
-     NULL,
-     afm_Courier_BoldOblique_highchars_index, 220,
-     afm_Courier_BoldOblique_ligatures, 1},
-    {                   /* Courier-Oblique.afm   761 bytes */
-     "Courier-Oblique", "Courier Oblique",
-     629, -157,
-     afm_Courier_Oblique_widths,
-     NULL,
-     NULL,
-     afm_Courier_Oblique_highchars_index, 220,
-     afm_Courier_Oblique_ligatures, 1},
-    {                   /* Helvetica.afm   7841 bytes */
-     "Helvetica", "Helvetica",
-     718, -207,
-     afm_Helvetica_widths,
-     afm_Helvetica_kerning_index,
-     afm_Helvetica_kerning_data,
-     afm_Helvetica_highchars_index, 220,
-     afm_Helvetica_ligatures, 1},
-    {                   /* Helvetica-Bold.afm   7336 bytes */
-     "Helvetica-Bold", "Helvetica Bold",
-     718, -207,
-     afm_Helvetica_Bold_widths,
-     afm_Helvetica_Bold_kerning_index,
-     afm_Helvetica_Bold_kerning_data,
-     afm_Helvetica_Bold_highchars_index, 220,
-     afm_Helvetica_Bold_ligatures, 1},
-    {                   /* Helvetica-BoldOblique.afm   7336 bytes */
-     "Helvetica-BoldOblique", "Helvetica Bold Oblique",
-     718, -207,
-     afm_Helvetica_BoldOblique_widths,
-     afm_Helvetica_BoldOblique_kerning_index,
-     afm_Helvetica_BoldOblique_kerning_data,
-     afm_Helvetica_BoldOblique_highchars_index, 220,
-     afm_Helvetica_BoldOblique_ligatures, 1},
-    {                   /* Helvetica-Oblique.afm   7841 bytes */
-     "Helvetica-Oblique", "Helvetica Oblique",
-     718, -207,
-     afm_Helvetica_Oblique_widths,
-     afm_Helvetica_Oblique_kerning_index,
-     afm_Helvetica_Oblique_kerning_data,
-     afm_Helvetica_Oblique_highchars_index, 220,
-     afm_Helvetica_Oblique_ligatures, 1},
-    {                   /* ZapfDingbats.afm   416 bytes */
-     "ZapfDingbats", "ITC Zapf Dingbats",
-     0, 0,
-     afm_ZapfDingbats_widths,
-     NULL,
-     NULL,
-     afm_ZapfDingbats_highchars_index, 107,
-     NULL, 0},
-    {                   /* Symbol.afm   563 bytes */
-     "Symbol", "Symbol",
-     0, 0,
-     afm_Symbol_widths,
-     NULL,
-     NULL,
-     afm_Symbol_highchars_index, 156,
-     NULL, 0},
-    {                   /* Times-Bold.afm   6761 bytes */
-     "Times-Bold", "Times Bold",
-     683, -217,
-     afm_Times_Bold_widths,
-     afm_Times_Bold_kerning_index,
-     afm_Times_Bold_kerning_data,
-     afm_Times_Bold_highchars_index, 220,
-     afm_Times_Bold_ligatures, 1},
-    {                   /* Times-BoldItalic.afm   6270 bytes */
-     "Times-BoldItalic", "Times Bold Italic",
-     683, -217,
-     afm_Times_BoldItalic_widths,
-     afm_Times_BoldItalic_kerning_index,
-     afm_Times_BoldItalic_kerning_data,
-     afm_Times_BoldItalic_highchars_index, 220,
-     afm_Times_BoldItalic_ligatures, 1},
-    {                   /* Times-Italic.afm   6975 bytes */
-     "Times-Italic", "Times Italic",
-     683, -217,
-     afm_Times_Italic_widths,
-     afm_Times_Italic_kerning_index,
-     afm_Times_Italic_kerning_data,
-     afm_Times_Italic_highchars_index, 220,
-     afm_Times_Italic_ligatures, 1},
-    {                   /* Times-Roman.afm   6287 bytes */
-     "Times-Roman", "Times Roman",
-     683, -217,
-     afm_Times_Roman_widths,
-     afm_Times_Roman_kerning_index,
-     afm_Times_Roman_kerning_data,
-     afm_Times_Roman_highchars_index, 220,
-     afm_Times_Roman_ligatures, 1},
-    {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
-};
-const int afm_fontinfo_count = 14;
diff --git a/src/rrd_afm_data.h b/src/rrd_afm_data.h
deleted file mode 100644 (file)
index f2b9fa3..0000000
+++ /dev/null
@@ -1,191 +0,0 @@
-/****************************************************************************
- * RRDtool 1.2.23  Copyright by Tobi Oetiker, 1997-2007
- ****************************************************************************
- * rrd_afm_data.h  Encoded afm (Adobe Font Metrics) for selected fonts.
- ****************************************************************************/
-
-#ifndef  RRD_AFM_DATA_H
-#define RRD_AFM_DATA_H
-
-/*
-Description of data structures:
-
-  Ideally, the struct should be a list of fonts, and each font
-  is a list of character-info.
-  Each character has a structure:
-    struct charinfo {
-      char16 thechar;
-      int width;
-      struct {
-       char16 nextchar;
-       int deltawidth;
-      } kernings[];
-      struct {
-       char16 nextchar;
-       char16 resultingchar;
-      } ligatures[];
-    }
-
-    The data for typical fonts makes this a very sparse data structure.
-    For most fonts, only the letter "f" has ligatures.
-    All fonts have all (or almost all) of the characters 32-126,
-    most fonts have all 161-255,
-    and all fonts have very few 256-65535.
-    Most kerning pairs have both chars 32-126.
-
-    The most basic design decisionÊis to have all this data as 
-    const C globals all set up by array/struct initialisers
-    so runtime setup overhead is minimal.
-    The complete other possibility would be to parse and load
-    this info at runtime, but for rrdtool I have preferred
-    speed for flexibility as the same few fonts will be used 
-    zillions of times.
-
-    So the idea is to rewrite the above structure into
-    something which:
-    1) uses/wastes minimal memory
-    2) is fast for most characters
-    3) supports at least Iso-Latin-1, prefer full unicode.
-    4) doesn't need full precision in char width
-       (we can afford to loose 0.2% as rrdtool only needs to calculate
-       overall layout of elements, not positioning individual
-       characters)
-    5) can be written as constant initialisers to C structs/arrays
-       so we don't have runtime overhead starting rrdtool.
-    6) can be easily generated by some script so it is easy
-       to select a set of fonts and have the C data updated.
-       So adding/removing fonts is a matter of a recompile.
-
-Implementation design:
-    All character structs are sorted by unicode value. Info for
-    characters below 32 is discarded and the chars are treated 
-    as a space. Missing characters in the 32-126 range are 
-    substituted with default values so we can use direct array 
-    access for those. For characters above 126, binary search 
-    is used (not yet, liniar now but uses good guess for most latin 1
-    characters).
-
-    Ligature handling can be discarded as ligatures have very small
-    effects on string width. The width of the "fi" ligature
-    is the same (or very close) to the width of "f" plus the width 
-    of "i".
-    If implemented, it can be a simple list (global for the font,
-    not for each character) because all fonts I've seen that have
-    ligatures has max 3 pairs: "fi", "fl", "ffl" and no other. 
-
-    Most characters has less than 10 kern pairs, few 10-20, and
-    extremly few 20-30. This is implemented as a simple
-    linear search with characters 256-65536 encoding using a prefix
-    so most kern pairs only take 2 bytes:
-    unsigned 8 bit char value and signed 8 bit kern width.
-    Using a non-packed format would enable binary search, but
-    would use almost twice as much memory for a yet unknown
-    gain in speed.
-
-    Character widths are stored as unsigned bytes. Width of
-    one character is font-size * bytevalue * (1000 / 6)
-    AFM specifies widths as integers with 1000 representing 1 * font-size.
-    Kerning delta widths has same scaling factor, but the value
-    is a signed byte as many kerning widths are negative and smaller
-    than avarage character width.
-
-    Kerning info is stored in a shared packed int8 array
-    to reduce the number of structs and memory usage.
-    This sets the maximum number of kerning pairs to
-    approx 15000.
-      The font I have seen with most kern pairs is
-      "Bodoni Old Face BE Bold Italic Oldstyle Figures"
-      which has 1718 pairs for 62 chars.
-      Typical fonts have 100-150 pairs.
-    For each character needs then only a 16 bit index
-    into this shared table.
-    The format of the sub-arrays are:
-      count ( unicode deltawidth )
-    with the (...) repeated count times.
-    The count and the unicode is packed because a lot
-    entries is less than 256, and most below 400.
-    Therefore an escape sequence is used.
-    If the value is >= 510
-      1, high-8bits, low-8bits
-    else if the value is >= 254
-      0, value minus 254
-    else
-      value plus 1
-    An index of zero is treated as a NULL pointer,
-    and the first byte in a shared array is
-    therefore not used (and filled with a dummy value).
-    The array is only created if non-empty.
-       No entries can be zero (they are redundant),
-       and no subarray can be empty (as the index pointer
-       then is 0 meaning no sub array).
-       The deltawidth is stored as a non-escaped signed byte.
-
-    So for each character needed info is:
-      width: unsigned 8 bit int.
-      kerning-subarray-index: unsigned 16 bit int.
-
-    The first 126-32+1 entries are for the characters
-    32-126. If any is missing, a dummy entry is created.
-    For characters 126-65535 a font-global
-    array of struct {unicode, char-index} is
-    used for binary search (not yet, liniar now).
-
-    Ligatures can be implemented as a font-global
-    array of struct {
-      unicode char1, char2, resultingchar;
-    }
-
-    Font-global info is stored in a struct afm_fontinfo (see below).
-
-    The highchars_index and ligatures structures are flattened
-    to a simple array to avoid accidental padding between
-    structs if the structsize is problematic for some platforms.
-
-    All fonts are stored in an array of this struct,
-    sorted by fullname for binary search (not yet sorted).
-
-    The .afm files are compiled by a perl script which creates
-    rrd_afm_data.c 
-    The only thing rrd_afm_data.c contains is this compiled data.
-
-    Compiled on Mac OS X the size of rrd_afm_data.o
-    is 67 Kb for the standard 14 postscript fonts,
-    and 490 Kb for a set of 276 Adobe fonts.
-*/
-
-typedef unsigned char afm_uint8;
-typedef signed char afm_sint8;
-typedef unsigned short afm_uint16;
-typedef signed short afm_sint16;
-typedef unsigned short afm_unicode;
-
-typedef const afm_uint8 afm_cuint8;
-typedef const afm_sint8 afm_csint8;
-typedef const afm_uint16 afm_cuint16;
-typedef const afm_sint16 afm_csint16;
-typedef const afm_unicode afm_cunicode;
-
-typedef struct afm_fontinfo {
-    const char *fullname;   /* e.g. "Futura Bold Oblique" */
-    const char *postscript_name;    /* e.g. "Futura-BoldOblique" */
-    afm_cuint16 ascender, descender;
-    afm_cuint8 *widths;
-    afm_csint16 *kerning_index;
-    afm_cuint8 *kerning_data;
-    afm_cuint16 *highchars_index;
-    afm_cuint16 highchars_count;
-    afm_cunicode *ligatures;
-    afm_cuint16 ligatures_count;
-} afm_fontinfo;
-
-typedef struct old_afm_fontinfo {
-    const char *fontname, *fullname;
-    const unsigned short *charinfo, *intarray;
-    const unsigned short charinfocount;
-    const unsigned short fixedpitch;
-} old_afm_fontinfo;
-
-extern const afm_fontinfo afm_fontinfolist[];
-extern const int afm_fontinfo_count;
-
-#endif
index 62088dd..ec6a574 100644 (file)
 #  define RRDPRINTF(...)
 # endif                         /* DEBUG */
 #endif                          /* _MSC_VER */
 #  define RRDPRINTF(...)
 # endif                         /* DEBUG */
 #endif                          /* _MSC_VER */
-#include "rrd_tool.h"
-#include <png.h>
-#include <ft2build.h>
-#include FT_FREETYPE_H
-#include FT_GLYPH_H
 
 
+#include "rrd_tool.h"
 #include "rrd_gfx.h"
 #include "rrd_gfx.h"
-#include "rrd_afm.h"
-#include "unused.h"
-
-/* lines are better drawn on the pixle than between pixles */
-#define LINEOFFSET 0.5
-
-#define USE_PDF_FAKE_ALPHA 1
-#define USE_EPS_FAKE_ALPHA 1
-
-typedef struct gfx_char_s *gfx_char;
-struct gfx_char_s {
-    FT_UInt   index;    /* glyph index */
-    FT_Vector pos;      /* location from baseline in 26.6 */
-    FT_Glyph  image;    /* glyph bitmap */
-};
-
-typedef struct gfx_string_s *gfx_string;
-struct gfx_string_s {
-    unsigned int width;
-    unsigned int height;
-    int       count;    /* number of characters */
-    gfx_char  glyphs;
-    size_t    num_glyphs;
-    FT_BBox   bbox;
-    FT_Matrix transform;
-};
-
-/* compute string bbox */
-static void compute_string_bbox(
-    gfx_string string);
-
-/* create a freetype glyph string */
-gfx_string gfx_string_create(
-    gfx_canvas_t *canvas,
-    FT_Face face,
-    const char *text,
-    int rotation,
-    double tabwidth,
-    double size);
-
-/* create a freetype glyph string */
-static void gfx_string_destroy(
-    gfx_string string);
-
-static
-gfx_node_t *gfx_new_node(
-    gfx_canvas_t *canvas,
-    enum gfx_en type)
-{
-    gfx_node_t *node = art_new(gfx_node_t, 1);
-
-    if (node == NULL)
-        return NULL;
-    node->type = type;
-    node->color = 0x0;  /* color of element  0xRRGGBBAA  alpha 0xff is solid */
-    node->size = 0.0;   /* font size, line width */
-    node->path = NULL;  /* path */
-    node->points = 0;
-    node->points_max = 0;
-    node->closed_path = 0;
-    node->filename = NULL;  /* font or image filename */
-    node->text = NULL;
-    node->x = 0.0;
-    node->y = 0.0;      /* position */
-    node->angle = 0;
-    node->halign = GFX_H_NULL;  /* text alignement */
-    node->valign = GFX_V_NULL;  /* text alignement */
-    node->tabwidth = 0.0;
-    node->next = NULL;
-    if (canvas->lastnode != NULL) {
-        canvas->lastnode->next = node;
-    }
-    if (canvas->firstnode == NULL) {
-        canvas->firstnode = node;
-    }
-    canvas->lastnode = node;
-    return node;
-}
-
-gfx_canvas_t *gfx_new_canvas(
-    void)
-{
-    gfx_canvas_t *canvas = art_new(gfx_canvas_t, 1);
 
 
-    canvas->firstnode = NULL;
-    canvas->lastnode = NULL;
-    canvas->imgformat = IF_PNG; /* we default to PNG output */
-    canvas->interlaced = 0;
-    canvas->zoom = 1.0;
-    canvas->font_aa_threshold = -1.0;
-    canvas->aa_type = AA_NORMAL;
-    return canvas;
-}
 
 /* create a new line */
 
 /* create a new line */
-gfx_node_t *gfx_new_line(
-    gfx_canvas_t *canvas,
+void gfx_line(
+    cairo_t * cr,
     double X0,
     double Y0,
     double X1,
     double X0,
     double Y0,
     double X1,
@@ -127,11 +31,11 @@ gfx_node_t *gfx_new_line(
     double width,
     gfx_color_t color)
 {
     double width,
     gfx_color_t color)
 {
-    return gfx_new_dashed_line(canvas, X0, Y0, X1, Y1, width, color, 0, 0);
+    gfx_dashed_line(cr, X0, Y0, X1, Y1, width, color, 0, 0);
 }
 
 }
 
-gfx_node_t *gfx_new_dashed_line(
-    gfx_canvas_t *canvas,
+void gfx_dashed_line(
+    cairo_t * cr,
     double X0,
     double Y0,
     double X1,
     double X0,
     double Y0,
     double X1,
@@ -141,39 +45,29 @@ gfx_node_t *gfx_new_dashed_line(
     double dash_on,
     double dash_off)
 {
     double dash_on,
     double dash_off)
 {
-
-    gfx_node_t *node;
-    ArtVpath *vec;
-
-    node = gfx_new_node(canvas, GFX_LINE);
-    if (node == NULL)
-        return NULL;
-    vec = art_new(ArtVpath, 3);
-    if (vec == NULL)
-        return NULL;
-    vec[0].code = ART_MOVETO_OPEN;
-    vec[0].x = X0 + LINEOFFSET;
-    vec[0].y = Y0 + LINEOFFSET;
-    vec[1].code = ART_LINETO;
-    vec[1].x = X1 + LINEOFFSET;
-    vec[1].y = Y1 + LINEOFFSET;
-    vec[2].code = ART_END;
-    vec[2].x = 0;
-    vec[2].y = 0;
-
-    node->points = 3;
-    node->points_max = 3;
-    node->color = color;
-    node->size = width;
-    node->dash_on = dash_on;
-    node->dash_off = dash_off;
-    node->path = vec;
-    return node;
+    double    dashes[] = { dash_on, dash_off };
+    double    x = 0;
+    double    y = 0;
+
+    cairo_save(cr);
+    cairo_new_path(cr);
+    cairo_set_line_width(cr, width);
+    gfx_line_fit(cr, &x, &y);
+    gfx_line_fit(cr, &X0, &Y0);
+    cairo_move_to(cr, X0, Y0);
+    gfx_line_fit(cr, &X1, &Y1);
+    cairo_line_to(cr, X1, Y1);
+    if (dash_on > 0 || dash_off > 0)
+        cairo_set_dash(cr, dashes, 2, x);
+    cairo_set_source_rgba(cr, color.red, color.green, color.blue,
+                          color.alpha);
+    cairo_stroke(cr);
+    cairo_restore(cr);
 }
 
 /* create a new area */
 }
 
 /* create a new area */
-gfx_node_t *gfx_new_area(
-    gfx_canvas_t *canvas,
+void gfx_new_area(
+    cairo_t * cr,
     double X0,
     double Y0,
     double X1,
     double X0,
     double Y0,
     double X1,
@@ -182,2712 +76,205 @@ gfx_node_t *gfx_new_area(
     double Y2,
     gfx_color_t color)
 {
     double Y2,
     gfx_color_t color)
 {
-
-    gfx_node_t *node;
-    ArtVpath *vec;
-
-    node = gfx_new_node(canvas, GFX_AREA);
-    if (node == NULL)
-        return NULL;
-    vec = art_new(ArtVpath, 5);
-    if (vec == NULL)
-        return NULL;
-    vec[0].code = ART_MOVETO;
-    vec[0].x = X0;
-    vec[0].y = Y0;
-    vec[1].code = ART_LINETO;
-    vec[1].x = X1;
-    vec[1].y = Y1;
-    vec[2].code = ART_LINETO;
-    vec[2].x = X2;
-    vec[2].y = Y2;
-    vec[3].code = ART_LINETO;
-    vec[3].x = X0;
-    vec[3].y = Y0;
-    vec[4].code = ART_END;
-    vec[4].x = 0;
-    vec[4].y = 0;
-
-    node->points = 5;
-    node->points_max = 5;
-    node->color = color;
-    node->path = vec;
-
-    return node;
+    cairo_new_path(cr);
+    gfx_area_fit(cr, &X0, &Y0);
+    cairo_move_to(cr, X0, Y0);
+    gfx_area_fit(cr, &X1, &Y1);
+    cairo_line_to(cr, X1, Y1);
+    gfx_area_fit(cr, &X2, &Y2);
+    cairo_line_to(cr, X2, Y2);
+    cairo_set_source_rgba(cr, color.red, color.green, color.blue,
+                          color.alpha);
 }
 
 /* add a point to a line or to an area */
 }
 
 /* add a point to a line or to an area */
-int gfx_add_point(
-    gfx_node_t *node,
+void gfx_add_point(
+    cairo_t * cr,
     double x,
     double y)
 {
     double x,
     double y)
 {
-    if (node == NULL)
-        return 1;
-    if (node->type == GFX_AREA) {
-        double    X0 = node->path[0].x;
-        double    Y0 = node->path[0].y;
-
-        node->points -= 2;
-        art_vpath_add_point(&(node->path),
-                            &(node->points),
-                            &(node->points_max), ART_LINETO, x, y);
-        art_vpath_add_point(&(node->path),
-                            &(node->points),
-                            &(node->points_max), ART_LINETO, X0, Y0);
-        art_vpath_add_point(&(node->path),
-                            &(node->points),
-                            &(node->points_max), ART_END, 0, 0);
-    } else if (node->type == GFX_LINE) {
-        node->points -= 1;
-        art_vpath_add_point(&(node->path),
-                            &(node->points),
-                            &(node->points_max),
-                            ART_LINETO, x + LINEOFFSET, y + LINEOFFSET);
-        art_vpath_add_point(&(node->path),
-                            &(node->points),
-                            &(node->points_max), ART_END, 0, 0);
-
-    } else {
-        /* can only add point to areas and lines */
-        return 1;
-    }
-    return 0;
+    gfx_area_fit(cr, &x, &y);
+    cairo_line_to(cr, x, y);
 }
 
 void gfx_close_path(
 }
 
 void gfx_close_path(
-    gfx_node_t *node)
+    cairo_t * cr)
 {
 {
-    node->closed_path = 1;
-    if (node->path[0].code == ART_MOVETO_OPEN)
-        node->path[0].code = ART_MOVETO;
+    cairo_close_path(cr);
+    cairo_fill(cr);
 }
 
 /* create a text node */
 }
 
 /* create a text node */
-gfx_node_t *gfx_new_text(
-    gfx_canvas_t *canvas,
+static PangoLayout *gfx_prep_text(
+    cairo_t * cr,
     double x,
     double x,
-    double y,
     gfx_color_t color,
     char *font,
     double size,
     double tabwidth,
     gfx_color_t color,
     char *font,
     double size,
     double tabwidth,
-    double angle,
-    enum gfx_h_align_en h_align,
-    enum gfx_v_align_en v_align,
-    char *text)
+    const char *text)
 {
 {
-    gfx_node_t *node = gfx_new_node(canvas, GFX_TEXT);
+    PangoLayout *layout;
+    PangoFontDescription *font_desc;
 
 
-    node->text = strdup(text);
-    node->size = size;
-    node->filename = strdup(font);
-    node->x = x;
-    node->y = y;
-    node->angle = angle;
-    node->color = color;
-    node->tabwidth = tabwidth;
-    node->halign = h_align;
-    node->valign = v_align;
-#if 0
-    /* debugging: show text anchor
-       green is along x-axis, red is downward y-axis */
-    if (1) {
-        double    a = 2 * M_PI * -node->angle / 360.0;
-        double    cos_a = cos(a);
-        double    sin_a = sin(a);
-        double    len = 3;
+    /* for performance reasons we might
+       want todo that only once ... tabs will always
+       be the same */
+    long      i;
+    long      tab_count = strlen(text);
+    long      tab_shift = fmod(x, tabwidth);
 
 
-        gfx_new_line(canvas,
-                     x, y, x + len * cos_a, y - len * sin_a, 0.2, 0x00FF0000);
-        gfx_new_line(canvas,
-                     x, y, x + len * sin_a, y + len * cos_a, 0.2, 0xFF000000);
-    }
-#endif
-    return node;
-}
+    PangoTabArray *tab_array;
 
 
-int gfx_render(
-    gfx_canvas_t *canvas,
-    art_u32 width,
-    art_u32 height,
-    gfx_color_t background,
-    FILE * fp)
-{
-    switch (canvas->imgformat) {
-    case IF_PNG:
-        return gfx_render_png(canvas, width, height, background, fp);
-    case IF_SVG:
-        return gfx_render_svg(canvas, width, height, background, fp);
-    case IF_EPS:
-        return gfx_render_eps(canvas, width, height, background, fp);
-    case IF_PDF:
-        return gfx_render_pdf(canvas, width, height, background, fp);
-    default:
-        return -1;
+    tab_array = pango_tab_array_new(tab_count, (gboolean) (1));
+    for (i = 1; i <= tab_count; i++) {
+        pango_tab_array_set_tab(tab_array,
+                                i, PANGO_TAB_LEFT, tabwidth * i - tab_shift);
     }
     }
-}
-
-static void gfx_string_destroy(
-    gfx_string string)
-{
-    unsigned int n;
+    cairo_new_path(cr);
+    cairo_set_source_rgba(cr, color.red, color.green, color.blue,
+                          color.alpha);
+    layout = pango_cairo_create_layout(cr);
 
 
-    if (string->glyphs) {
-        for (n = 0; n < string->num_glyphs; ++n)
-            FT_Done_Glyph(string->glyphs[n].image);
-        free(string->glyphs);
-    }
-    free(string);
+    pango_layout_set_tabs(layout, tab_array);
+    font_desc = pango_font_description_from_string(font);
+    pango_font_description_set_size(font_desc, size * PANGO_SCALE);
+    pango_layout_set_font_description(layout, font_desc);
+    pango_layout_set_markup(layout, text, -1);
+    return layout;
 }
 
 }
 
-
+/* Size Text Node */
 double gfx_get_text_width(
 double gfx_get_text_width(
-    gfx_canvas_t *canvas,
+    cairo_t * cr,
     double start,
     char *font,
     double size,
     double tabwidth,
     double start,
     char *font,
     double size,
     double tabwidth,
-    char *text,
-    int rotation)
+    char *text)
 {
 {
-    switch (canvas->imgformat) {
-    case IF_PNG:
-        return gfx_get_text_width_libart(canvas, start, font, size, tabwidth,
-                                         text, rotation);
-    case IF_SVG:       /* fall through */
-    case IF_EPS:
-    case IF_PDF:
-        return afm_get_text_width(start, font, size, tabwidth, text);
-    default:
-        return size * strlen(text);
+    PangoLayout *layout;
+    PangoRectangle log_rect;
+    gfx_color_t color = { 0, 0, 0, 0 };
+    char     *tab;
+
+    /* turn \\t into tab */
+    while (tab = strstr(text, "\\t")) {
+        memmove(tab + 1, tab + 2, strlen(tab + 2));
+        tab[0] = (char) 9;
     }
     }
+    layout = gfx_prep_text(cr, start, color, font, size, tabwidth, text);
+    pango_layout_get_pixel_extents(layout, NULL, &log_rect);
+    pango_tab_array_free(pango_layout_get_tabs(layout));
+    g_object_unref(layout);
+    return log_rect.width;
 }
 
 }
 
-double gfx_get_text_width_libart(
-    gfx_canvas_t *canvas,
-    double UNUSED(start),
+void gfx_text(
+    cairo_t * cr,
+    double x,
+    double y,
+    gfx_color_t color,
     char *font,
     double size,
     double tabwidth,
     char *font,
     double size,
     double tabwidth,
-    char *text,
-    int rotation)
-{
-
-    int       error;
-    double    text_width = 0;
-    FT_Face   face;
-    FT_Library library = NULL;
-    gfx_string string;
-
-    FT_Init_FreeType(&library);
-    error = FT_New_Face(library, font, 0, &face);
-    if (error) {
-        FT_Done_FreeType(library);
-        return -1;
-    }
-    error = FT_Set_Char_Size(face, size * 64, size * 64, 100, 100);
-    if (error) {
-        FT_Done_FreeType(library);
-        return -1;
-    }
-    string = gfx_string_create(canvas, face, text, rotation, tabwidth, size);
-    text_width = string->width;
-    gfx_string_destroy(string);
-    FT_Done_FreeType(library);
-    return text_width / 64;
-}
-
-static void gfx_libart_close_path(
-    gfx_node_t *node,
-    ArtVpath ** vec)
-{
-    /* libart must have end==start for closed paths,
-       even if using ART_MOVETO and not ART_MOVETO_OPEN
-       so add extra point which is the same as the starting point */
-    int       points_max = node->points;    /* scaled array has exact size */
-    int       points = node->points - 1;
-
-    art_vpath_add_point(vec, &points, &points_max, ART_LINETO,
-                        (**vec).x, (**vec).y);
-    art_vpath_add_point(vec, &points, &points_max, ART_END, 0, 0);
-}
-
-
-/* find bbox of a string */
-static void compute_string_bbox(
-    gfx_string string)
-{
-    unsigned int n;
-    FT_BBox   bbox;
-
-    bbox.xMin = bbox.yMin = 32000;
-    bbox.xMax = bbox.yMax = -32000;
-    for (n = 0; n < string->num_glyphs; n++) {
-        FT_BBox   glyph_bbox;
-
-        FT_Glyph_Get_CBox(string->glyphs[n].image, ft_glyph_bbox_gridfit,
-                          &glyph_bbox);
-        if (glyph_bbox.xMin < bbox.xMin) {
-            bbox.xMin = glyph_bbox.xMin;
-        }
-        if (glyph_bbox.yMin < bbox.yMin) {
-            bbox.yMin = glyph_bbox.yMin;
-        }
-        if (glyph_bbox.xMax > bbox.xMax) {
-            bbox.xMax = glyph_bbox.xMax;
-        }
-        if (glyph_bbox.yMax > bbox.yMax) {
-            bbox.yMax = glyph_bbox.yMax;
-        }
-    }
-    if (bbox.xMin > bbox.xMax) {
-        bbox.xMin = 0;
-        bbox.yMin = 0;
-        bbox.xMax = 0;
-        bbox.yMax = 0;
-    }
-    string->bbox.xMin = bbox.xMin;
-    string->bbox.xMax = bbox.xMax;
-    string->bbox.yMin = bbox.yMin;
-    string->bbox.yMax = bbox.yMax;
-}
-
-/* create a free type glyph string */
-gfx_string gfx_string_create(
-    gfx_canvas_t *canvas,
-    FT_Face face,
-    const char *text,
-    int rotation,
-    double tabwidth,
-    double size)
-{
-
-    FT_GlyphSlot slot = face->glyph;    /* a small shortcut */
-    FT_Bool   use_kerning;
-    FT_UInt   previous;
-    FT_Vector ft_pen;
-
-    gfx_string string = (gfx_string) malloc(sizeof(struct gfx_string_s));
-
-    gfx_char  glyph;    /* current glyph in table */
-    int       n;
-    int       error;
-    int       gottab = 0;
-
-#ifdef HAVE_MBSTOWCS
-    wchar_t  *cstr;
-    size_t    clen = strlen(text) + 1;
-
-    cstr = malloc(sizeof(wchar_t) * clen);  /* yes we are allocating probably too much here, I know */
-    string->count = mbstowcs(cstr, text, clen);
-    if (string->count == -1) {
-        /* conversion did not work, so lets fall back to just use what we got */
-        string->count = clen - 1;
-        for (n = 0; text[n] != '\0'; n++) {
-            cstr[n] = (unsigned char) text[n];
-        }
-    }
-#else
-    char     *cstr = strdup(text);
-
-    string->count = strlen(text);
-#endif
-
-    ft_pen.x = 0;       /* start at (0,0) !! */
-    ft_pen.y = 0;
-
-
-    string->width = 0;
-    string->height = 0;
-    string->glyphs =
-        (gfx_char) calloc(string->count, sizeof(struct gfx_char_s));
-    string->num_glyphs = 0;
-    string->transform.xx =
-        (FT_Fixed) (cos(M_PI * (rotation) / 180.0) * 0x10000);
-    string->transform.xy =
-        (FT_Fixed) (-sin(M_PI * (rotation) / 180.0) * 0x10000);
-    string->transform.yx =
-        (FT_Fixed) (sin(M_PI * (rotation) / 180.0) * 0x10000);
-    string->transform.yy =
-        (FT_Fixed) (cos(M_PI * (rotation) / 180.0) * 0x10000);
-
-    use_kerning = FT_HAS_KERNING(face);
-    previous = 0;
-    glyph = string->glyphs;
-    for (n = 0; n < string->count; glyph++, n++) {
-        FT_Vector vec;
-
-        /* handle the tabs ...
-           have a witespace glyph inserted, but set its width such that the distance
-           of the new right edge is x times tabwidth from 0,0 where x is an integer. */
-        unsigned int letter = cstr[n];
-
-        letter = afm_fix_osx_charset(letter);   /* unsafe macro */
-
-        gottab = 0;
-        if (letter == '\\' && n + 1 < string->count && cstr[n + 1] == 't') {
-            /* we have a tab here so skip the backslash and
-               set t to ' ' so that we get a white space */
-            gottab = 1;
-            n++;
-            letter = ' ';
-        }
-        if (letter == '\t') {
-            letter = ' ';
-            gottab = 1;
-        }
-        /* initialize each struct gfx_char_s */
-        glyph->index = 0;
-        glyph->pos.x = 0;
-        glyph->pos.y = 0;
-        glyph->image = NULL;
-        glyph->index = FT_Get_Char_Index(face, letter);
-
-        /* compute glyph origin */
-        if (use_kerning && previous && glyph->index) {
-            FT_Vector kerning;
-
-            FT_Get_Kerning(face, previous, glyph->index,
-                           ft_kerning_default, &kerning);
-            ft_pen.x += kerning.x;
-            ft_pen.y += kerning.y;
-        }
-
-        /* load the glyph image (in its native format) */
-        /* for now, we take a monochrome glyph bitmap */
-        error =
-            FT_Load_Glyph(face, glyph->index,
-                          size >
-                          canvas->font_aa_threshold ? canvas->aa_type ==
-                          AA_NORMAL ? FT_LOAD_TARGET_NORMAL : canvas->
-                          aa_type ==
-                          AA_LIGHT ? FT_LOAD_TARGET_LIGHT :
-                          FT_LOAD_TARGET_MONO : FT_LOAD_TARGET_MONO);
-        if (error) {
-            RRDPRINTF("couldn't load glyph:  %c\n", letter)
-                continue;
-        }
-        error = FT_Get_Glyph(slot, &glyph->image);
-        if (error) {
-            RRDPRINTF("couldn't get glyph %c from slot %d\n", letter,
-                      (int) slot)
-                continue;
-        }
-        /* if we are in tabbing mode, we replace the tab with a space and shift the position
-           of the space so that its left edge is where the tab was supposed to land us */
-        if (gottab) {
-            /* we are in gridfitting mode so the calculations happen in 1/64 pixles */
-            ft_pen.x =
-                tabwidth * 64.0 * (float) (1 +
-                                           (long) (ft_pen.x /
-                                                   (tabwidth * 64.0))) -
-                slot->advance.x;
-        }
-        /* store current pen position */
-        glyph->pos.x = ft_pen.x;
-        glyph->pos.y = ft_pen.y;
-
-
-        ft_pen.x += slot->advance.x;
-        ft_pen.y += slot->advance.y;
-
-        /* rotate glyph */
-        vec = glyph->pos;
-        FT_Vector_Transform(&vec, &string->transform);
-        error = FT_Glyph_Transform(glyph->image, &string->transform, &vec);
-        if (error) {
-            RRDPRINTF("couldn't transform glyph id %d\n", letter)
-                continue;
-        }
-
-        /* convert to a bitmap - destroy native image */
-        error =
-            FT_Glyph_To_Bitmap(&glyph->image,
-                               size >
-                               canvas->font_aa_threshold ? canvas->aa_type ==
-                               AA_NORMAL ? FT_RENDER_MODE_NORMAL : canvas->
-                               aa_type ==
-                               AA_LIGHT ? FT_RENDER_MODE_LIGHT :
-                               FT_RENDER_MODE_MONO : FT_RENDER_MODE_MONO, 0,
-                               1);
-        if (error) {
-            RRDPRINTF("couldn't convert glyph id %d to bitmap\n", letter)
-                continue;
-        }
-
-        /* increment number of glyphs */
-        previous = glyph->index;
-        string->num_glyphs++;
-    }
-    free(cstr);
-/*  printf ("number of glyphs = %d\n", string->num_glyphs);*/
-    compute_string_bbox(string);
-    /* the last character was a tab */
-    /* if (gottab) { */
-    string->width = ft_pen.x;
-    /* } else {
-       string->width = string->bbox.xMax - string->bbox.xMin;
-       } */
-    string->height = string->bbox.yMax - string->bbox.yMin;
-    return string;
-}
-
-
-static int gfx_save_png(
-    art_u8 * buffer,
-    FILE * fp,
-    long width,
-    long height,
-    long bytes_per_pixel);
-
-/* render grafics into png image */
-
-int gfx_render_png(
-    gfx_canvas_t *canvas,
-    art_u32 width,
-    art_u32 height,
-    gfx_color_t background,
-    FILE * fp)
-{
-
-
-    FT_Library library;
-    gfx_node_t *node = canvas->firstnode;
-
-    /*
-       art_u8 red = background >> 24, green = (background >> 16) & 0xff;
-       art_u8 blue = (background >> 8) & 0xff, alpha = ( background & 0xff );
-     */
-    unsigned long pys_width = width * canvas->zoom;
-    unsigned long pys_height = height * canvas->zoom;
-    const int bytes_per_pixel = 4;
-    unsigned long rowstride = pys_width * bytes_per_pixel;  /* bytes per pixel */
-
-    /* fill that buffer with out background color */
-    gfx_color_t *buffp = art_new(gfx_color_t, pys_width * pys_height);
-    art_u8   *buffer = (art_u8 *) buffp;
-    unsigned long i;
-
-    for (i = 0; i < pys_width * pys_height; i++) {
-        *(buffp++) = background;
-    }
-    FT_Init_FreeType(&library);
-    while (node) {
-        switch (node->type) {
-        case GFX_LINE:
-        case GFX_AREA:{
-            ArtVpath *vec;
-            double    dst[6];
-            ArtSVP   *svp;
-
-            art_affine_scale(dst, canvas->zoom, canvas->zoom);
-            vec = art_vpath_affine_transform(node->path, dst);
-            if (node->closed_path)
-                gfx_libart_close_path(node, &vec);
-            /* gfx_round_scaled_coordinates(vec); */
-            /* pvec = art_vpath_perturb(vec);
-               art_free(vec); */
-            if (node->type == GFX_LINE) {
-                svp = art_svp_vpath_stroke(vec, ART_PATH_STROKE_JOIN_ROUND,
-                                           ART_PATH_STROKE_CAP_ROUND,
-                                           node->size * canvas->zoom, 4,
-                                           0.25);
-            } else {
-                svp = art_svp_from_vpath(vec);
-                /* this takes time and is unnecessary since we make
-                   sure elsewhere that the areas are going clock-whise */
-                /*  svpt = art_svp_uncross( svp );
-                   art_svp_free(svp);
-                   svp  = art_svp_rewind_uncrossed(svpt,ART_WIND_RULE_NONZERO); 
-                   art_svp_free(svpt);
-                 */
-            }
-            art_free(vec);
-            /* this is from gnome since libart does not have this yet */
-            gnome_print_art_rgba_svp_alpha(svp, 0, 0, pys_width, pys_height,
-                                           node->color, buffer, rowstride,
-                                           NULL);
-            art_svp_free(svp);
-            break;
-        }
-        case GFX_TEXT:{
-            unsigned int n;
-            int       error;
-            art_u8    fcolor[4], falpha;
-            FT_Face   face;
-            gfx_char  glyph;
-            gfx_string string;
-            FT_Vector vec;  /* 26.6 */
-
-            float     pen_x = 0.0, pen_y = 0.0;
-
-            /* double x,y; */
-            long      ix, iy;
-
-            fcolor[0] = node->color >> 24;
-            fcolor[1] = (node->color >> 16) & 0xff;
-            fcolor[2] = (node->color >> 8) & 0xff;
-            falpha = node->color & 0xff;
-            error = FT_New_Face(library, (char *) node->filename, 0, &face);
-            if (error) {
-                rrd_set_error("failed to load %s", node->filename);
-
-                break;
-            }
-            error = FT_Set_Char_Size(face,  /* handle to face object            */
-                                     (long) (node->size * 64),
-                                     (long) (node->size * 64),
-                                     (long) (100 * canvas->zoom),
-                                     (long) (100 * canvas->zoom));
-            if (error) {
-                FT_Done_Face(face);
-                break;
-            }
-            pen_x = node->x * canvas->zoom;
-            pen_y = node->y * canvas->zoom;
-
-            string =
-                gfx_string_create(canvas, face, node->text, node->angle,
-                                  node->tabwidth, node->size);
-            FT_Done_Face(face);
-
-            switch (node->halign) {
-            case GFX_H_RIGHT:
-                vec.x = -string->bbox.xMax;
-                break;
-            case GFX_H_CENTER:
-                vec.x = abs(string->bbox.xMax) >= abs(string->bbox.xMin) ?
-                    -string->bbox.xMax / 2 : -string->bbox.xMin / 2;
-                break;
-            case GFX_H_LEFT:
-                vec.x = -string->bbox.xMin;
-                break;
-            case GFX_H_NULL:
-                vec.x = 0;
-                break;
-            }
-
-            switch (node->valign) {
-            case GFX_V_TOP:
-                vec.y = string->bbox.yMax;
-                break;
-            case GFX_V_CENTER:
-                vec.y = abs(string->bbox.yMax) >= abs(string->bbox.yMin) ?
-                    string->bbox.yMax / 2 : string->bbox.yMin / 2;
-                break;
-            case GFX_V_BOTTOM:
-                vec.y = 0;
-                break;
-            case GFX_V_NULL:
-                vec.y = 0;
-                break;
-            }
-            pen_x += vec.x / 64;
-            pen_y += vec.y / 64;
-            glyph = string->glyphs;
-            for (n = 0; n < string->num_glyphs; n++, glyph++) {
-                int       gr;
-                FT_Glyph  image;
-                FT_BitmapGlyph bit;
-
-                /* long buf_x,comp_n; */
-                /* make copy to transform */
-                if (!glyph->image) {
-                    RRDPRINTF("no image\n")
-                        continue;
-                }
-                error = FT_Glyph_Copy(glyph->image, &image);
-                if (error) {
-                    RRDPRINTF("couldn't copy image\n")
-                        continue;
-                }
-
-                /* transform it */
-                vec = glyph->pos;
-                FT_Vector_Transform(&vec, &string->transform);
-
-                bit = (FT_BitmapGlyph) image;
-                gr = bit->bitmap.num_grays - 1;
-/* 
-               buf_x = (pen_x + 0.5) + (double)bit->left;
-               comp_n = buf_x + bit->bitmap.width > pys_width ? pys_width - buf_x : bit->bitmap.width;
-                if (buf_x < 0 || buf_x >= (long)pys_width) continue;
-               buf_x *=  bytes_per_pixel ;
-               for (iy=0; iy < bit->bitmap.rows; iy++){                    
-                   long buf_y = iy+(pen_y+0.5)-(double)bit->top;
-                   if (buf_y < 0 || buf_y >= (long)pys_height) continue;
-                    buf_y *= rowstride;
-                   for (ix=0;ix < bit->bitmap.width;ix++){             
-                       *(letter + (ix*bytes_per_pixel+3)) = *(bit->bitmap.buffer + iy * bit->bitmap.width + ix);
-                   }
-                   art_rgba_rgba_composite(buffer + buf_y + buf_x ,letter,comp_n);
-                }
-                art_free(letter);
-*/
-                switch (bit->bitmap.pixel_mode) {
-                case FT_PIXEL_MODE_GRAY:
-                    for (iy = 0; iy < bit->bitmap.rows; iy++) {
-                        long      buf_y = iy + (pen_y + 0.5) - bit->top;
-
-                        if (buf_y < 0 || buf_y >= (long) pys_height)
-                            continue;
-                        buf_y *= rowstride;
-                        for (ix = 0; ix < bit->bitmap.width; ix++) {
-                            long      buf_x =
-                                ix + (pen_x + 0.5) + (double) bit->left;
-                            art_u8    font_alpha;
-
-                            if (buf_x < 0 || buf_x >= (long) pys_width)
-                                continue;
-                            buf_x *= bytes_per_pixel;
-                            font_alpha =
-                                *(bit->bitmap.buffer +
-                                  iy * bit->bitmap.pitch + ix);
-                            if (font_alpha > 0) {
-                                fcolor[3] =
-                                    (art_u8) ((double) font_alpha / gr *
-                                              falpha);
-                                art_rgba_rgba_composite(buffer + buf_y +
-                                                        buf_x, fcolor, 1);
-                            }
-                        }
-                    }
-                    break;
-
-                case FT_PIXEL_MODE_MONO:
-                    for (iy = 0; iy < bit->bitmap.rows; iy++) {
-                        long      buf_y = iy + (pen_y + 0.5) - bit->top;
-
-                        if (buf_y < 0 || buf_y >= (long) pys_height)
-                            continue;
-                        buf_y *= rowstride;
-                        for (ix = 0; ix < bit->bitmap.width; ix++) {
-                            long      buf_x =
-                                ix + (pen_x + 0.5) + (double) bit->left;
-
-                            if (buf_x < 0 || buf_x >= (long) pys_width)
-                                continue;
-                            buf_x *= bytes_per_pixel;
-                            if ((fcolor[3] =
-                                 falpha *
-                                 ((*
-                                   (bit->bitmap.buffer +
-                                    iy * bit->bitmap.pitch + ix / 8) >> (7 -
-                                                                         (ix %
-                                                                          8)))
-                                  & 1)) > 0)
-                                art_rgba_rgba_composite(buffer + buf_y +
-                                                        buf_x, fcolor, 1);
-                        }
-                    }
-                    break;
-
-                default:
-                    rrd_set_error("unknown freetype pixel mode: %d",
-                                  bit->bitmap.pixel_mode);
-                    break;
-                }
-
-/*
-                for (iy=0; iy < bit->bitmap.rows; iy++){                   
-                    long buf_y = iy+(pen_y+0.5)-bit->top;
-                    if (buf_y < 0 || buf_y >= (long)pys_height) continue;
-                    buf_y *= rowstride;
-                    for (ix=0;ix < bit->bitmap.width;ix++){
-                        long buf_x = ix + (pen_x + 0.5) + (double)bit->left ;
-                        art_u8 font_alpha;
-                        
-                        if (buf_x < 0 || buf_x >= (long)pys_width) continue;
-                        buf_x *=  bytes_per_pixel ;
-                        font_alpha =  *(bit->bitmap.buffer + iy * bit->bitmap.width + ix);
-                        font_alpha =  (art_u8)((double)font_alpha / gr * falpha);
-                        for (iz = 0; iz < 3; iz++){
-                            art_u8 *orig = buffer + buf_y + buf_x + iz;
-                            *orig =  (art_u8)((double)*orig / gr * ( gr - font_alpha) +
-                                              (double)fcolor[iz] / gr * (font_alpha));
-                        }
-                    }
-                }
-*/
-                FT_Done_Glyph(image);
-            }
-            gfx_string_destroy(string);
-        }
-        }
-        node = node->next;
-    }
-    gfx_save_png(buffer, fp, pys_width, pys_height, bytes_per_pixel);
-    art_free(buffer);
-    FT_Done_FreeType(library);
-    return 0;
-}
-
-/* free memory used by nodes this will also remove memory required for
-   associated paths and svcs ... but not for text strings */
-int gfx_destroy(
-    gfx_canvas_t *canvas)
-{
-    gfx_node_t *next, *node = canvas->firstnode;
-
-    while (node) {
-        next = node->next;
-        art_free(node->path);
-        free(node->text);
-        free(node->filename);
-        art_free(node);
-        node = next;
-    }
-    art_free(canvas);
-    return 0;
-}
-
-static int gfx_save_png(
-    art_u8 * buffer,
-    FILE * fp,
-    long width,
-    long height,
-    long bytes_per_pixel)
-{
-    png_structp png_ptr = NULL;
-    png_infop info_ptr = NULL;
-    int       i;
-    png_bytep *row_pointers;
-    int       rowstride = width * bytes_per_pixel;
-    png_text  text[2];
-
-    if (fp == NULL)
-        return (1);
-
-    png_ptr =
-        png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
-    if (png_ptr == NULL) {
-        return (1);
-    }
-    row_pointers = (png_bytepp) png_malloc(png_ptr,
-                                           height * sizeof(png_bytep));
-
-    info_ptr = png_create_info_struct(png_ptr);
-
-    if (info_ptr == NULL) {
-        png_free(png_ptr, row_pointers);
-        png_destroy_write_struct(&png_ptr, (png_infopp) NULL);
-        return (1);
-    }
-
-    if (setjmp(png_jmpbuf(png_ptr))) {
-        /* If we get here, we had a problem writing the file */
-        png_destroy_write_struct(&png_ptr, &info_ptr);
-        return (1);
-    }
-
-    png_init_io(png_ptr, fp);
-    png_set_IHDR(png_ptr, info_ptr, width, height,
-                 8, PNG_COLOR_TYPE_RGB_ALPHA,
-                 PNG_INTERLACE_NONE,
-                 PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
-
-    text[0].key = "Software";
-    text[0].text =
-        "RRDtool, Tobias Oetiker <tobi@oetike.ch>, http://tobi.oetiker.ch";
-    text[0].compression = PNG_TEXT_COMPRESSION_NONE;
-    png_set_text(png_ptr, info_ptr, text, 1);
-
-    /* lets make this fast while ending up with some increass in image size */
-    png_set_filter(png_ptr, 0, PNG_FILTER_NONE);
-    /* png_set_filter(png_ptr,0,PNG_FILTER_SUB); */
-    png_set_compression_level(png_ptr, 1);
-    /* png_set_compression_strategy(png_ptr,Z_HUFFMAN_ONLY); */
-    /* 
-       png_set_filter(png_ptr,PNG_FILTER_TYPE_BASE,PNG_FILTER_SUB);
-       png_set_compression_strategy(png_ptr,Z_HUFFMAN_ONLY);
-       png_set_compression_level(png_ptr,Z_BEST_SPEED); */
-
-    /* Write header data */
-    png_write_info(png_ptr, info_ptr);
-    for (i = 0; i < height; i++)
-        row_pointers[i] = (png_bytep) (buffer + i * rowstride);
-
-    png_write_image(png_ptr, row_pointers);
-    png_write_end(png_ptr, info_ptr);
-    png_free(png_ptr, row_pointers);
-    png_destroy_write_struct(&png_ptr, &info_ptr);
-    return 1;
-}
-
-
-/* ----- COMMON ROUTINES for pdf, svg and eps */
-#define min3(a, b, c) (a < b ? (a < c ? a : c) : (b < c ? b : c))
-#define max3(a, b, c) (a > b ? (a > c ? a : c) : (b > c ? b : c))
-
-#define PDF_CALC_DEBUG 0
-
-typedef struct pdf_point {
-    double    x, y;
-} pdf_point;
-
-typedef struct {
-    double    ascender, descender, baselineY;
-    pdf_point sizep, minp, maxp;
-    double    x, y, tdx, tdy;
-    double    r, cos_r, sin_r;
-    double    ma, mb, mc, md, mx, my;   /* pdf coord matrix */
-    double    tmx, tmy; /* last 2 coords of text coord matrix */
-#if PDF_CALC_DEBUG
-    int       debug;
-#endif
-} pdf_coords;
-
-#if PDF_CALC_DEBUG
-static void pdf_dump_calc(
-    gfx_node_t *node,
-    pdf_coords * g)
-{
-    fprintf(stderr, "PDF CALC =============================\n");
-    fprintf(stderr, "   '%s' at %f pt\n", node->text, node->size);
-    fprintf(stderr, "   align h = %s, v = %s,  sizep = %f, %f\n",
-            (node->halign == GFX_H_RIGHT ? "r" :
-             (node->halign == GFX_H_CENTER ? "c" :
-              (node->halign == GFX_H_LEFT ? "l" : "N"))),
-            (node->valign == GFX_V_TOP ? "t" :
-             (node->valign == GFX_V_CENTER ? "c" :
-              (node->valign == GFX_V_BOTTOM ? "b" : "N"))),
-            g->sizep.x, g->sizep.y);
-    fprintf(stderr, "   r = %f = %f, cos = %f, sin = %f\n",
-            g->r, node->angle, g->cos_r, g->sin_r);
-    fprintf(stderr, "   ascender = %f, descender = %f, baselineY = %f\n",
-            g->ascender, g->descender, g->baselineY);
-    fprintf(stderr, "   sizep: %f, %f\n", g->sizep.x, g->sizep.y);
-    fprintf(stderr, "   minp: %f, %f     maxp = %f, %f\n",
-            g->minp.x, g->minp.y, g->maxp.x, g->maxp.y);
-    fprintf(stderr, "   x = %f, y = %f\n", g->x, g->y);
-    fprintf(stderr, "   tdx = %f, tdy = %f\n", g->tdx, g->tdy);
-    fprintf(stderr, "   GM = %f, %f, %f, %f, %f, %f\n",
-            g->ma, g->mb, g->mc, g->md, g->mx, g->my);
-    fprintf(stderr, "   TM = %f, %f, %f, %f, %f, %f\n",
-            g->ma, g->mb, g->mc, g->md, g->tmx, g->tmy);
-}
-#endif
-
-#if PDF_CALC_DEBUG
-#define PDF_DD(x) if (g->debug) x;
-#else
-#define PDF_DD(x)
-#endif
-
-static void pdf_rotate(
-    pdf_coords * g,
-    pdf_point *p)
-{
-    double    x2 = g->cos_r * p->x - g->sin_r * p->y;
-    double    y2 = g->sin_r * p->x + g->cos_r * p->y;
-
-    PDF_DD(fprintf
-           (stderr, "  rotate(%f, %f) -> %f, %f\n", p->x, p->y, x2, y2))
-        p->x = x2;
-    p->y = y2;
-}
-
-
-static void pdf_calc(
-    int page_height,
-    gfx_node_t *node,
-    pdf_coords * g)
+    double angle,
+    enum gfx_h_align_en h_align,
+    enum gfx_v_align_en v_align,
+    const char *text)
 {
 {
-    pdf_point a, b, c;
-
-#if PDF_CALC_DEBUG
-    /* g->debug = !!strstr(node->text, "RevProxy-1") || !!strstr(node->text, "08:00"); */
-    g->debug = !!strstr(node->text, "sekunder")
-        || !!strstr(node->text, "Web");
-#endif
-    g->x = node->x;
-    g->y = page_height - node->y;
-    if (node->angle) {
-        g->r = 2 * M_PI * node->angle / 360.0;
-        g->cos_r = cos(g->r);
-        g->sin_r = sin(g->r);
-    } else {
-        g->r = 0;
-        g->cos_r = 1;
-        g->sin_r = 0;
-    }
-    g->ascender = afm_get_ascender(node->filename, node->size);
-    g->descender = afm_get_descender(node->filename, node->size);
-    g->sizep.x =
-        afm_get_text_width(0, node->filename, node->size, node->tabwidth,
-                           node->text);
-    /* seems like libart ignores the descender when doing vertial-align = bottom,
-       so we do that too, to get labels v-aligning properly */
-    g->sizep.y = -g->ascender;  /* + afm_get_descender(font->ps_font, node->size); */
-    g->baselineY = -g->ascender - g->sizep.y / 2;
-    a.x = g->sizep.x;
-    a.y = g->sizep.y;
-    b.x = g->sizep.x;
-    b.y = 0;
-    c.x = 0;
-    c.y = g->sizep.y;
-    if (node->angle) {
-        pdf_rotate(g, &a);
-        pdf_rotate(g, &b);
-        pdf_rotate(g, &c);
-    }
-    g->minp.x = min3(a.x, b.x, c.x);
-    g->minp.y = min3(a.y, b.y, c.y);
-    g->maxp.x = max3(a.x, b.x, c.x);
-    g->maxp.y = max3(a.y, b.y, c.y);
-    /* The alignment parameters in node->valign and node->halign
-       specifies the alignment in the non-rotated coordinate system
-       (very unlike pdf/postscript), which complicates matters.
-     */
-    switch (node->halign) {
+    PangoLayout *layout;
+    PangoRectangle log_rect;
+    PangoRectangle ink_rect;
+    double    sx = 0;
+    double    sy = 0;
+
+    cairo_save(cr);
+    cairo_translate(cr, x, y);
+/*    gfx_line(cr,-2,0,2,0,1,color);
+    gfx_line(cr,0,-2,0,2,1,color); */
+    layout = gfx_prep_text(cr, x, color, font, size, tabwidth, text);
+    pango_layout_get_pixel_extents(layout, &ink_rect, &log_rect);
+    cairo_rotate(cr, -angle * G_PI / 180.0);
+    sx = log_rect.x;
+    sy = ink_rect.y;
+    switch (h_align) {
     case GFX_H_RIGHT:
     case GFX_H_RIGHT:
-        g->tdx = -g->maxp.x;
+        sx -= log_rect.width;
         break;
     case GFX_H_CENTER:
         break;
     case GFX_H_CENTER:
-        g->tdx = -(g->maxp.x + g->minp.x) / 2;
+        sx -= log_rect.width / 2;
         break;
     case GFX_H_LEFT:
         break;
     case GFX_H_LEFT:
-        g->tdx = -g->minp.x;
         break;
     case GFX_H_NULL:
         break;
     case GFX_H_NULL:
-        g->tdx = 0;
         break;
     }
         break;
     }
-    switch (node->valign) {
+    sy += log_rect.y;
+    switch (v_align) {
     case GFX_V_TOP:
     case GFX_V_TOP:
-        g->tdy = -g->maxp.y;
         break;
     case GFX_V_CENTER:
         break;
     case GFX_V_CENTER:
-        g->tdy = -(g->maxp.y + g->minp.y) / 2;
+        sy -= log_rect.height / 2;
         break;
     case GFX_V_BOTTOM:
         break;
     case GFX_V_BOTTOM:
-        g->tdy = -g->minp.y;
+        sy -= log_rect.height;
         break;
     case GFX_V_NULL:
         break;
     case GFX_V_NULL:
-        g->tdy = 0;
         break;
     }
         break;
     }
-    g->ma = g->cos_r;
-    g->mb = g->sin_r;
-    g->mc = -g->sin_r;
-    g->md = g->cos_r;
-    g->mx = g->x + g->tdx;
-    g->my = g->y + g->tdy;
-    g->tmx = g->mx - g->ascender * g->mc;
-    g->tmy = g->my - g->ascender * g->md;
-    PDF_DD(pdf_dump_calc(node, g))
-}
-
-/* ------- SVG -------
-   SVG reference:
-   http://www.w3.org/TR/SVG/
-*/
-static int svg_indent = 0;
-static int svg_single_line = 0;
-static const char *svg_default_font = "-dummy-";
-typedef struct svg_dash {
-    int       dash_enable;
-    double    dash_adjust, dash_len, dash_offset;
-    double    adjusted_on, adjusted_off;
-} svg_dash;
+    pango_cairo_update_layout(cr, layout);
+    cairo_move_to(cr, sx, sy);
+    pango_cairo_show_layout(cr, layout);
+    pango_tab_array_free(pango_layout_get_tabs(layout));
+    g_object_unref(layout);
+    cairo_restore(cr);
 
 
-
-static void svg_print_indent(
-    FILE * fp)
-{
-    int       i;
-
-    for (i = svg_indent - svg_single_line; i > 0; i--) {
-        putc(' ', fp);
-        putc(' ', fp);
-    }
 }
 
 }
 
-static void svg_start_tag(
-    FILE * fp,
-    const char *name)
+/* convert color */
+struct gfx_color_t gfx_hex_to_col(
+    long unsigned int color)
 {
 {
-    svg_print_indent(fp);
-    putc('<', fp);
-    fputs(name, fp);
-    svg_indent++;
-}
+    struct gfx_color_t gfx_color;
 
 
-static void svg_close_tag_single_line(
-    FILE * fp)
-{
-    svg_single_line++;
-    putc('>', fp);
+    gfx_color.red = 1.0 / 255.0 * ((color & 0xff000000) >> (3 * 8));
+    gfx_color.green = 1.0 / 255.0 * ((color & 0x00ff0000) >> (2 * 8));
+    gfx_color.blue = 1.0 / 255.0 * ((color & 0x0000ff00) >> (1 * 8));
+    gfx_color.alpha = 1.0 / 255.0 * (color & 0x000000ff);
+    return gfx_color;
 }
 
 }
 
-static void svg_close_tag(
-    FILE * fp)
-{
-    putc('>', fp);
-    if (!svg_single_line)
-        putc('\n', fp);
-}
+/* gridfit_lines */
 
 
-static void svg_end_tag(
-    FILE * fp,
-    const char *name)
+void gfx_line_fit(
+    cairo_t * cr,
+    double *x,
+    double *y)
 {
 {
-    /* name is NULL if closing empty-node tag */
-    svg_indent--;
-    if (svg_single_line)
-        svg_single_line--;
-    else if (name)
-        svg_print_indent(fp);
-    if (name != NULL) {
-        fputs("</", fp);
-        fputs(name, fp);
-    } else {
-        putc('/', fp);
-    }
-    svg_close_tag(fp);
-}
-
-static void svg_close_tag_empty_node(
-    FILE * fp)
-{
-    svg_end_tag(fp, NULL);
-}
-
-static void svg_write_text(
-    FILE * fp,
-    const char *text)
-{
-#ifdef HAVE_MBSTOWCS
-    size_t    clen;
-    wchar_t  *p, *cstr, ch;
-    int       text_count;
-
-    if (!text)
-        return;
-    clen = strlen(text) + 1;
-    cstr = malloc(sizeof(wchar_t) * clen);
-    text_count = mbstowcs(cstr, text, clen);
-    if (text_count == -1)
-        text_count = mbstowcs(cstr, "Enc-Err", 6);
-    p = cstr;
-#else
-    unsigned char *p = text;
-    unsigned char *cstr;
-    char      ch;
-
-    if (!p)
-        return;
-#endif
-    while (1) {
-        ch = *p++;
-        ch = afm_fix_osx_charset(ch);   /* unsafe macro */
-        switch (ch) {
-        case 0:
-#ifdef HAVE_MBSTOWCS
-            free(cstr);
-#endif
-            return;
-        case '&':
-            fputs("&amp;", fp);
-            break;
-        case '<':
-            fputs("&lt;", fp);
-            break;
-        case '>':
-            fputs("&gt;", fp);
-            break;
-        case '"':
-            fputs("&quot;", fp);
-            break;
-        default:
-            if (ch == 32) {
-#ifdef HAVE_MBSTOWCS
-                if (p <= cstr + 1 || !*p || *p == 32)
-                    fputs("&#160;", fp);    /* non-breaking space in unicode */
-                else
-#endif
-                    fputc(32, fp);
-            } else if (ch < 32 || ch >= 127)
-                fprintf(fp, "&#%d;", (int) ch);
-            else
-                putc((char) ch, fp);
-        }
-    }
-}
-
-static void svg_format_number(
-    char *buf,
-    int bufsize,
-    double d)
-{
-    /* omit decimals if integer to reduce filesize */
-    char     *p;
-
-    snprintf(buf, bufsize, "%.2f", d);
-    p = buf;            /* doesn't trust snprintf return value */
-    while (*p)
-        p++;
-    while (--p > buf) {
-        char      ch = *p;
-
-        if (ch == '0') {
-            *p = '\0';  /* zap trailing zeros */
-            continue;
-        }
-        if (ch == '.')
-            *p = '\0';  /* zap trailing dot */
-        break;
-    }
-}
-
-static void svg_write_number(
-    FILE * fp,
-    double d)
-{
-    char      buf[60];
-
-    svg_format_number(buf, sizeof(buf), d);
-    fputs(buf, fp);
-}
-
-static int svg_color_is_black(
-    int c)
-{
-    /* gfx_color_t is RRGGBBAA */
-    return c == 0x000000FF;
-}
-
-static void svg_write_color(
-    FILE * fp,
-    gfx_color_t c,
-    const char *attr)
-{
-    /* gfx_color_t is RRGGBBAA, svg can use #RRGGBB and #RGB like html */
-    gfx_color_t rrggbb = (int) ((c >> 8) & 0xFFFFFF);
-    gfx_color_t opacity = c & 0xFF;
-
-    fprintf(fp, " %s=\"", attr);
-    if ((rrggbb & 0x0F0F0F) == ((rrggbb >> 4) & 0x0F0F0F)) {
-        /* css2 short form, #rgb is #rrggbb, not #r0g0b0 */
-        fprintf(fp, "#%03lX", (((rrggbb >> 8) & 0xF00)
-                               | ((rrggbb >> 4) & 0x0F0)
-                               | (rrggbb & 0x00F)));
-    } else {
-        fprintf(fp, "#%06lX", rrggbb);
-    }
-    fputs("\"", fp);
-    if (opacity != 0xFF) {
-        fprintf(fp, " opacity=\"");
-        svg_write_number(fp, opacity / 255.0);
-        fputs("\"", fp);
-    }
-}
-
-static void svg_get_dash(
-    gfx_node_t *node,
-    svg_dash *d)
-{
-    double    offset;
-    int       mult;
-
-    if (node->dash_on <= 0 || node->dash_off <= 0) {
-        d->dash_enable = 0;
-        return;
-    }
-    d->dash_enable = 1;
-    d->dash_len = node->dash_on + node->dash_off;
-    /* dash on/off adjustment due to round caps */
-    d->dash_adjust = 0.8 * node->size;
-    d->adjusted_on = node->dash_on - d->dash_adjust;
-    if (d->adjusted_on < 0.01)
-        d->adjusted_on = 0.01;
-    d->adjusted_off = d->dash_len - d->adjusted_on;
-    /* dash offset calc */
-    if (node->path[0].x == node->path[1].x) /* only good for horz/vert lines */
-        offset = node->path[0].y;
-    else
-        offset = node->path[0].x;
-    mult = (int) fabs(offset / d->dash_len);
-    d->dash_offset = offset - mult * d->dash_len;
-    if (node->path[0].x < node->path[1].x
-        || node->path[0].y < node->path[1].y)
-        d->dash_offset = d->dash_len - d->dash_offset;
-}
-
-static int svg_dash_equal(
-    svg_dash *a,
-    svg_dash *b)
-{
-    if (a->dash_enable != b->dash_enable)
-        return 0;
-    if (a->adjusted_on != b->adjusted_on)
-        return 0;
-    if (a->adjusted_off != b->adjusted_off)
-        return 0;
-    /* rest of properties will be the same when on+off are */
-    return 1;
-}
-
-static void svg_common_path_attributes(
-    FILE * fp,
-    gfx_node_t *node)
-{
-    svg_dash  dash_info;
-
-    svg_get_dash(node, &dash_info);
-    fputs(" stroke-width=\"", fp);
-    svg_write_number(fp, node->size);
-    fputs("\"", fp);
-    svg_write_color(fp, node->color, "stroke");
-    fputs(" fill=\"none\"", fp);
-    if (dash_info.dash_enable) {
-        if (dash_info.dash_offset != 0) {
-            fputs(" stroke-dashoffset=\"", fp);
-            svg_write_number(fp, dash_info.dash_offset);
-            fputs("\"", fp);
-        }
-        fputs(" stroke-dasharray=\"", fp);
-        svg_write_number(fp, dash_info.adjusted_on);
-        fputs(",", fp);
-        svg_write_number(fp, dash_info.adjusted_off);
-        fputs("\"", fp);
-    }
-}
-
-static int svg_is_int_step(
-    double a,
-    double b)
-{
-    double    diff = fabs(a - b);
-
-    return floor(diff) == diff;
-}
-
-static int svg_path_straight_segment(
-    FILE * fp,
-    double lastA,
-    double currentA,
-    double currentB,
-    gfx_node_t *node,
-    int segment_idx,
-    int isx,
-    char absChar,
-    char relChar)
-{
-    if (!svg_is_int_step(lastA, currentA)) {
-        putc(absChar, fp);
-        svg_write_number(fp, currentA);
-        return 0;
-    }
-    if (segment_idx < node->points - 1) {
-        ArtVpath *vec = node->path + segment_idx + 1;
-
-        if (vec->code == ART_LINETO) {
-            double    nextA = (isx ? vec->x : vec->y) - LINEOFFSET;
-            double    nextB = (isx ? vec->y : vec->x) - LINEOFFSET;
-
-            if (nextB == currentB
-                && ((currentA >= lastA) == (nextA >= currentA))
-                && svg_is_int_step(currentA, nextA)) {
-                return 1;   /* skip to next as it is a straight line  */
-            }
-        }
-    }
-    putc(relChar, fp);
-    svg_write_number(fp, currentA - lastA);
-    return 0;
-}
-
-static void svg_path(
-    FILE * fp,
-    gfx_node_t *node,
-    int multi)
-{
-    int       i;
-    double    lastX = 0, lastY = 0;
-
-    /* for straight lines <path..> tags take less space than
-       <line..> tags because of the efficient packing
-       in the 'd' attribute */
-    svg_start_tag(fp, "path");
-    if (!multi)
-        svg_common_path_attributes(fp, node);
-    fputs(" d=\"", fp);
-    /* specification of the 'd' attribute: */
-    /* http://www.w3.org/TR/SVG/paths.html#PathDataGeneralInformation */
-    for (i = 0; i < node->points; i++) {
-        ArtVpath *vec = node->path + i;
-        double    x = vec->x - LINEOFFSET;
-        double    y = vec->y - LINEOFFSET;
-
-        switch (vec->code) {
-        case ART_MOVETO_OPEN:  /* fall-through */
-        case ART_MOVETO:
-            putc('M', fp);
-            svg_write_number(fp, x);
-            putc(',', fp);
-            svg_write_number(fp, y);
-            break;
-        case ART_LINETO:
-            /* try optimize filesize by using minimal lineto commands */
-            /* without introducing rounding errors. */
-            if (x == lastX) {
-                if (svg_path_straight_segment
-                    (fp, lastY, y, x, node, i, 0, 'V', 'v'))
-                    continue;
-            } else if (y == lastY) {
-                if (svg_path_straight_segment
-                    (fp, lastX, x, y, node, i, 1, 'H', 'h'))
-                    continue;
-            } else {
-                putc('L', fp);
-                svg_write_number(fp, x);
-                putc(',', fp);
-                svg_write_number(fp, y);
-            }
-            break;
-        case ART_CURVETO:
-            break;      /* unsupported */
-        case ART_END:
-            break;      /* nop */
-        }
-        lastX = x;
-        lastY = y;
-    }
-    if (node->closed_path)
-        fputs(" Z", fp);
-    fputs("\"", fp);
-    svg_close_tag_empty_node(fp);
-}
-
-static void svg_multi_path(
-    FILE * fp,
-    gfx_node_t **nodeR)
-{
-    /* optimize for multiple paths with the same color, penwidth, etc. */
-    int       num = 1;
-    gfx_node_t *node = *nodeR;
-    gfx_node_t *next = node->next;
-
-    while (next) {
-        if (next->type != node->type
-            || next->size != node->size
-            || next->color != node->color
-            || next->dash_on != node->dash_on
-            || next->dash_off != node->dash_off)
-            break;
-        next = next->next;
-        num++;
-    }
-    if (num == 1) {
-        svg_path(fp, node, 0);
-        return;
-    }
-    svg_start_tag(fp, "g");
-    svg_common_path_attributes(fp, node);
-    svg_close_tag(fp);
-    while (num && node) {
-        svg_path(fp, node, 1);
-        if (!--num)
-            break;
-        node = node->next;
-        *nodeR = node;
-    }
-    svg_end_tag(fp, "g");
-}
-
-static void svg_area(
-    FILE * fp,
-    gfx_node_t *node)
-{
-    int       i;
-    double    startX = 0, startY = 0;
-
-    svg_start_tag(fp, "polygon");
-    fputs(" ", fp);
-    svg_write_color(fp, node->color, "fill");
-    fputs(" points=\"", fp);
-    for (i = 0; i < node->points; i++) {
-        ArtVpath *vec = node->path + i;
-        double    x = vec->x - LINEOFFSET;
-        double    y = vec->y - LINEOFFSET;
-
-        switch (vec->code) {
-        case ART_MOVETO_OPEN:  /* fall-through */
-        case ART_MOVETO:
-            svg_write_number(fp, x);
-            putc(',', fp);
-            svg_write_number(fp, y);
-            startX = x;
-            startY = y;
-            break;
-        case ART_LINETO:
-            if (i == node->points - 2
-                && node->path[i + 1].code == ART_END
-                && fabs(x - startX) < 0.001 && fabs(y - startY) < 0.001) {
-                break;  /* poly area always closed, no need for last point */
-            }
-            putc(' ', fp);
-            svg_write_number(fp, x);
-            putc(',', fp);
-            svg_write_number(fp, y);
-            break;
-        case ART_CURVETO:
-            break;      /* unsupported */
-        case ART_END:
-            break;      /* nop */
-        }
-    }
-    fputs("\"", fp);
-    svg_close_tag_empty_node(fp);
-}
-
-static void svg_text(
-    FILE * fp,
-    gfx_node_t *node)
-{
-    pdf_coords g;
-    const char *fontname;
-
-    /* as svg has 0,0 in top-left corner (like most screens) instead of
-       bottom-left corner like pdf and eps, we have to fake the coords
-       using offset and inverse sin(r) value */
-    int       page_height = 1000;
-
-    pdf_calc(page_height, node, &g);
-    if (node->angle != 0) {
-        svg_start_tag(fp, "g");
-        /* can't use svg_write_number as 2 decimals is far from enough to avoid
-           skewed text */
-        fprintf(fp, " transform=\"matrix(%f,%f,%f,%f,%f,%f)\"",
-                g.ma, -g.mb, -g.mc, g.md, g.tmx, page_height - g.tmy);
-        svg_close_tag(fp);
-    }
-    svg_start_tag(fp, "text");
-    if (!node->angle) {
-        fputs(" x=\"", fp);
-        svg_write_number(fp, g.tmx);
-        fputs("\" y=\"", fp);
-        svg_write_number(fp, page_height - g.tmy);
-        fputs("\"", fp);
-    }
-    fontname = afm_get_font_name(node->filename);
-    if (strcmp(fontname, svg_default_font))
-        fprintf(fp, " font-family=\"%s\"", fontname);
-    fputs(" font-size=\"", fp);
-    svg_write_number(fp, node->size);
-    fputs("\"", fp);
-    if (!svg_color_is_black(node->color))
-        svg_write_color(fp, node->color, "fill");
-    svg_close_tag_single_line(fp);
-    /* support for node->tabwidth missing */
-    svg_write_text(fp, node->text);
-    svg_end_tag(fp, "text");
-    if (node->angle != 0)
-        svg_end_tag(fp, "g");
-}
-
-int gfx_render_svg(
-    gfx_canvas_t *canvas,
-    art_u32 width,
-    art_u32 height,
-    gfx_color_t background,
-    FILE * fp)
-{
-    gfx_node_t *node = canvas->firstnode;
-
-    /* Find the first font used, and assume it is the mostly used
-       one. It reduces the number of font-familty attributes. */
-    while (node) {
-        if (node->type == GFX_TEXT && node->filename) {
-            svg_default_font = afm_get_font_name(node->filename);
-            break;
-        }
-        node = node->next;
-    }
-    fputs("<?xml version=\"1.0\" standalone=\"no\"?>\n"
-          "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.0//EN\"\n"
-          "   \"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd\">\n"
-          "<!--\n"
-          "   SVG file created by\n"
-          "        RRDtool " PACKAGE_VERSION
-          " Tobias Oetiker, http://tobi.oetiker.ch\n" "\n"
-          "   The width/height attributes in the outhermost svg node\n"
-          "   are just default sizes for the browser which is used\n"
-          "   if the svg file is openened directly without being\n"
-          "   embedded in an html file.\n"
-          "   The viewBox is the local coord system for rrdtool.\n" "-->\n",
-          fp);
-    svg_start_tag(fp, "svg");
-    fputs(" width=\"", fp);
-    svg_write_number(fp, width * canvas->zoom);
-    fputs("\" height=\"", fp);
-    svg_write_number(fp, height * canvas->zoom);
-    fputs("\" x=\"0\" y=\"0\" viewBox=\"", fp);
-    svg_write_number(fp, -LINEOFFSET);
-    fputs(" ", fp);
-    svg_write_number(fp, -LINEOFFSET);
-    fputs(" ", fp);
-    svg_write_number(fp, width - LINEOFFSET);
-    fputs(" ", fp);
-    svg_write_number(fp, height - LINEOFFSET);
-    fputs("\" preserveAspectRatio=\"xMidYMid\"", fp);
-    fprintf(fp, " font-family=\"%s\"", svg_default_font);   /* default font */
-    fputs(" stroke-linecap=\"round\" stroke-linejoin=\"round\"", fp);
-    fputs(" xmlns=\"http://www.w3.org/2000/svg\"", fp);
-    fputs(" xmlns:xlink=\"http://www.w3.org/1999/xlink\"", fp);
-    svg_close_tag(fp);
-    svg_start_tag(fp, "rect");
-    fprintf(fp, " x=\"0\" y=\"0\" width=\"%d\" height=\"%d\"", width, height);
-    svg_write_color(fp, background, "fill");
-    svg_close_tag_empty_node(fp);
-    node = canvas->firstnode;
-    while (node) {
-        switch (node->type) {
-        case GFX_LINE:
-            svg_multi_path(fp, &node);
-            break;
-        case GFX_AREA:
-            svg_area(fp, node);
-            break;
-        case GFX_TEXT:
-            svg_text(fp, node);
-        }
-        node = node->next;
-    }
-    svg_end_tag(fp, "svg");
-    return 0;
-}
-
-/* ------- EPS -------
-   EPS and Postscript references:
-   http://partners.adobe.com/asn/developer/technotes/postscript.html
-*/
-
-typedef struct eps_font {
-    const char *ps_font;
-    int       id;
-    struct eps_font *next;
-} eps_font;
-
-typedef struct eps_state {
-    FILE     *fp;
-    gfx_canvas_t *canvas;
-    art_u32   page_width, page_height;
-    eps_font *font_list;
-  /*--*/
-    gfx_color_t color;
-    const char *font;
-    double    font_size;
     double    line_width;
     double    line_width;
-    int       linecap, linejoin;
-    int       has_dash;
-} eps_state;
-
-static void eps_set_color(
-    eps_state *state,
-    gfx_color_t color)
-{
-#if USE_EPS_FAKE_ALPHA
-    double    a1, a2;
-#endif
-    /* gfx_color_t is RRGGBBAA */
-    if (state->color == color)
-        return;
-#if USE_EPS_FAKE_ALPHA
-    a1 = (color & 255) / 255.0;
-    a2 = 255 * (1 - a1);
-#define eps_color_calc(x) (int)( ((x) & 255) * a1 + a2)
-#else
-#define eps_color_calc(x) (int)( (x) & 255)
-#endif
-    /* gfx_color_t is RRGGBBAA */
-    if (state->color == color)
-        return;
-    fprintf(state->fp, "%d %d %d Rgb\n",
-            eps_color_calc(color >> 24),
-            eps_color_calc(color >> 16), eps_color_calc(color >> 8));
-    state->color = color;
-}
-
-static int eps_add_font(
-    eps_state *state,
-    gfx_node_t *node)
-{
-    /* The fonts list could be postponed to the end using
-       (atend), but let's be nice and have them in the header. */
-    const char *ps_font = afm_get_font_postscript_name(node->filename);
-    eps_font *ef;
-
-    for (ef = state->font_list; ef; ef = ef->next) {
-        if (!strcmp(ps_font, ef->ps_font))
-            return 0;
-    }
-    ef = malloc(sizeof(eps_font));
-    if (ef == NULL) {
-        rrd_set_error("malloc for eps_font");
-        return -1;
-    }
-    ef->next = state->font_list;
-    ef->ps_font = ps_font;
-    state->font_list = ef;
-    return 0;
-}
-
-static void eps_list_fonts(
-    eps_state *state,
-    const char *dscName)
-{
-    eps_font *ef;
-    int       lineLen = strlen(dscName);
-
-    if (!state->font_list)
-        return;
-    fputs(dscName, state->fp);
-    for (ef = state->font_list; ef; ef = ef->next) {
-        int       nameLen = strlen(ef->ps_font);
-
-        if (lineLen + nameLen > 100 && lineLen) {
-            fputs("\n", state->fp);
-            fputs("%%- \n", state->fp);
-            lineLen = 5;
-        } else {
-            fputs(" ", state->fp);
-            lineLen++;
-        }
-        fputs(ef->ps_font, state->fp);
-        lineLen += nameLen;
-    }
-    fputs("\n", state->fp);
-}
-
-static void eps_define_fonts(
-    eps_state *state)
-{
-    eps_font *ef;
-
-    if (!state->font_list)
-        return;
-    for (ef = state->font_list; ef; ef = ef->next) {
-        /* PostScript¨ LANGUAGE REFERENCE third edition
-           page 349 */
-        fprintf(state->fp,
-                "%%\n"
-                "/%s findfont dup length dict begin\n"
-                "{ 1 index /FID ne {def} {pop pop} ifelse } forall\n"
-                "/Encoding ISOLatin1Encoding def\n"
-                "currentdict end\n"
-                "/%s-ISOLatin1 exch definefont pop\n"
-                "/SetFont-%s { /%s-ISOLatin1 findfont exch scalefont setfont } bd\n",
-                ef->ps_font, ef->ps_font, ef->ps_font, ef->ps_font);
-    }
-}
-
-static int eps_prologue(
-    eps_state *state)
-{
-    gfx_node_t *node;
-
-    fputs("%!PS-Adobe-3.0 EPSF-3.0\n"
-          "%%Creator: RRDtool " PACKAGE_VERSION
-          " Tobias Oetiker, http://tobi.oetiker.ch\n"
-          /* can't like weird chars here */
-          "%%Title: (RRDtool output)\n"
-          "%%DocumentData: Clean7Bit\n" "", state->fp);
-    fprintf(state->fp, "%%%%BoundingBox: 0 0 %d %d\n",
-            state->page_width, state->page_height);
-    for (node = state->canvas->firstnode; node; node = node->next) {
-        if (node->type == GFX_TEXT && eps_add_font(state, node) == -1)
-            return -1;
-    }
-    eps_list_fonts(state, "%%DocumentFonts:");
-    eps_list_fonts(state, "%%DocumentNeededFonts:");
-    fputs("%%EndComments\n" "%%BeginProlog\n" "%%EndProlog\n"   /* must have, or BoundingBox is ignored */
-          "/bd { bind def } bind def\n" "", state->fp);
-    fprintf(state->fp, "/X { %.2f add } bd\n", LINEOFFSET);
-    fputs("/X2 {X exch X exch} bd\n"
-          "/M {X2 moveto} bd\n"
-          "/L {X2 lineto} bd\n"
-          "/m {moveto} bd\n"
-          "/l {lineto} bd\n"
-          "/S {stroke} bd\n"
-          "/CP {closepath} bd\n"
-          "/WS {setlinewidth stroke} bd\n"
-          "/F {fill} bd\n"
-          "/T1 {gsave} bd\n"
-          "/T2 {concat 0 0 moveto show grestore} bd\n"
-          "/T   {moveto show} bd\n"
-          "/Rgb { 255.0 div 3 1 roll\n"
-          "       255.0 div 3 1 roll \n"
-          "       255.0 div 3 1 roll setrgbcolor } bd\n" "", state->fp);
-    eps_define_fonts(state);
-    return 0;
-}
-
-static void eps_clear_dash(
-    eps_state *state)
-{
-    if (!state->has_dash)
-        return;
-    state->has_dash = 0;
-    fputs("[1 0] 0 setdash\n", state->fp);
-}
-
-static void eps_write_linearea(
-    eps_state *state,
-    gfx_node_t *node)
-{
-    int       i;
-    FILE     *fp = state->fp;
-    int       useOffset = 0;
-    int       clearDashIfAny = 1;
-
-    eps_set_color(state, node->color);
-    if (node->type == GFX_LINE) {
-        svg_dash  dash_info;
-
-        if (state->linecap != 1) {
-            fputs("1 setlinecap\n", fp);
-            state->linecap = 1;
-        }
-        if (state->linejoin != 1) {
-            fputs("1 setlinejoin\n", fp);
-            state->linejoin = 1;
-        }
-        svg_get_dash(node, &dash_info);
-        if (dash_info.dash_enable) {
-            clearDashIfAny = 0;
-            state->has_dash = 1;
-            fputs("[", fp);
-            svg_write_number(fp, dash_info.adjusted_on);
-            fputs(" ", fp);
-            svg_write_number(fp, dash_info.adjusted_off);
-            fputs("] ", fp);
-            svg_write_number(fp, dash_info.dash_offset);
-            fputs(" setdash\n", fp);
-        }
-    }
-    if (clearDashIfAny)
-        eps_clear_dash(state);
-    for (i = 0; i < node->points; i++) {
-        ArtVpath *vec = node->path + i;
-        double    x = vec->x;
-        double    y = state->page_height - vec->y;
-
-        if (vec->code == ART_MOVETO_OPEN || vec->code == ART_MOVETO)
-            useOffset = (fabs(x - floor(x) - 0.5) < 0.01
-                         && fabs(y - floor(y) - 0.5) < 0.01);
-        if (useOffset) {
-            x -= LINEOFFSET;
-            y -= LINEOFFSET;
-        }
-        switch (vec->code) {
-        case ART_MOVETO_OPEN:  /* fall-through */
-        case ART_MOVETO:
-            svg_write_number(fp, x);
-            fputc(' ', fp);
-            svg_write_number(fp, y);
-            fputc(' ', fp);
-            fputs(useOffset ? "M\n" : "m\n", fp);
-            break;
-        case ART_LINETO:
-            svg_write_number(fp, x);
-            fputc(' ', fp);
-            svg_write_number(fp, y);
-            fputc(' ', fp);
-            fputs(useOffset ? "L\n" : "l\n", fp);
-            break;
-        case ART_CURVETO:
-            break;      /* unsupported */
-        case ART_END:
-            break;      /* nop */
-        }
-    }
-    if (node->type == GFX_LINE) {
-        if (node->closed_path)
-            fputs("CP ", fp);
-        if (node->size != state->line_width) {
-            state->line_width = node->size;
-            svg_write_number(fp, state->line_width);
-            fputs(" WS\n", fp);
-        } else {
-            fputs("S\n", fp);
-        }
-    } else {
-        fputs("F\n", fp);
-    }
-}
-
-static void eps_write_text(
-    eps_state *state,
-    gfx_node_t *node)
-{
-    FILE     *fp = state->fp;
-    const char *ps_font = afm_get_font_postscript_name(node->filename);
-    int       lineLen = 0;
-    pdf_coords g;
-
-#ifdef HAVE_MBSTOWCS
-    size_t    clen;
-    wchar_t  *p, *cstr, ch;
-    int       text_count;
-
-    if (!node->text)
-        return;
-    clen = strlen(node->text) + 1;
-    cstr = malloc(sizeof(wchar_t) * clen);
-    text_count = mbstowcs(cstr, node->text, clen);
-    if (text_count == -1)
-        text_count = mbstowcs(cstr, "Enc-Err", 6);
-    p = cstr;
-#else
-    const unsigned char *p = node->text;
-    unsigned char ch;
-
-    if (!p)
-        return;
-#endif
-    pdf_calc(state->page_height, node, &g);
-    eps_set_color(state, node->color);
-    if (strcmp(ps_font, state->font) || node->size != state->font_size) {
-        state->font = ps_font;
-        state->font_size = node->size;
-        svg_write_number(fp, state->font_size);
-        fprintf(fp, " SetFont-%s\n", state->font);
-    }
-    if (node->angle)
-        fputs("T1 ", fp);
-    fputs("(", fp);
-    lineLen = 20;
-    while (1) {
-        ch = *p;
-        if (!ch)
-            break;
-        ch = afm_fix_osx_charset(ch);   /* unsafe macro */
-        if (++lineLen > 70) {
-            fputs("\\\n", fp);  /* backslash and \n */
-            lineLen = 0;
-        }
-        switch (ch) {
-        case '%':
-        case '(':
-        case ')':
-        case '\\':
-            fputc('\\', fp);
-            fputc(ch, fp);
-            break;
-        case '\n':
-            fputs("\\n", fp);
-            break;
-        case '\r':
-            fputs("\\r", fp);
-            break;
-        case '\t':
-            fputs("\\t", fp);
-            break;
-        default:
-            if (ch > 255) {
-                fputc('?', fp);
-            } else if (ch >= 126 || ch < 32) {
-                fprintf(fp, "\\%03o", (unsigned int) ch);
-                lineLen += 3;
-            } else {
-                fputc(ch, fp);
-            }
-        }
-        p++;
-    }
-#ifdef HAVE_MBSTOWCS
-    free(cstr);
-#endif
-    if (node->angle) {
-        /* can't use svg_write_number as 2 decimals is far from enough to avoid
-           skewed text */
-        fprintf(fp, ") [%f %f %f %f %f %f] T2\n",
-                g.ma, g.mb, g.mc, g.md, g.tmx, g.tmy);
-    } else {
-        fputs(") ", fp);
-        svg_write_number(fp, g.tmx);
-        fputs(" ", fp);
-        svg_write_number(fp, g.tmy);
-        fputs(" T\n", fp);
-    }
-}
-
-static int eps_write_content(
-    eps_state *state)
-{
-    gfx_node_t *node;
-
-    fputs("%\n", state->fp);
-    for (node = state->canvas->firstnode; node; node = node->next) {
-        switch (node->type) {
-        case GFX_LINE:
-        case GFX_AREA:
-            eps_write_linearea(state, node);
-            break;
-        case GFX_TEXT:
-            eps_write_text(state, node);
-            break;
-        }
-    }
-    return 0;
-}
-
-int gfx_render_eps(
-    gfx_canvas_t *canvas,
-    art_u32 width,
-    art_u32 height,
-    gfx_color_t background,
-    FILE * fp)
-{
-    struct eps_state state;
-
-    state.fp = fp;
-    state.canvas = canvas;
-    state.page_width = width;
-    state.page_height = height;
-    state.font = "no-default-font";
-    state.font_size = -1;
-    state.color = 0;    /* black */
-    state.font_list = NULL;
-    state.linecap = -1;
-    state.linejoin = -1;
-    state.has_dash = 0;
-    state.line_width = 1;
-    if (eps_prologue(&state) == -1)
-        return -1;
-    eps_set_color(&state, background);
-    fprintf(fp, "0 0 M 0 %d L %d %d L %d 0 L fill\n",
-            height, width, height, width);
-    if (eps_write_content(&state) == -1)
-        return 0;
-    fputs("showpage\n", fp);
-    fputs("%%EOF\n", fp);
-    while (state.font_list) {
-        eps_font *next = state.font_list->next;
-
-        free(state.font_list);
-        state.font_list = next;
-    }
-    return 0;
-}
-
-/* ------- PDF -------
-   PDF references page:
-   http://partners.adobe.com/public/developer/pdf/index_reference.html
-*/
-
-typedef struct pdf_buffer {
-    int       id, is_obj, is_dict, is_stream, pdf_file_pos;
-    char     *data;
-    int       alloc_size, current_size;
-    struct pdf_buffer *previous_buffer, *next_buffer;
-    struct pdf_state *state;
-} pdf_buffer;
-
-typedef struct pdf_font {
-    const char *ps_font;
-    pdf_buffer obj;
-    struct pdf_font *next;
-} pdf_font;
-
-typedef struct pdf_state {
-    FILE     *fp;
-    gfx_canvas_t *canvas;
-    art_u32   page_width, page_height;
-    pdf_font *font_list;
-    pdf_buffer *first_buffer, *last_buffer;
-    int       pdf_file_pos;
-    int       has_failed;
-  /*--*/
-    gfx_color_t stroke_color, fill_color;
-    int       font_id;
-    double    font_size;
-    double    line_width;
-    svg_dash  dash;
-    int       linecap, linejoin;
-    int       last_obj_id;
-  /*--*/
-    pdf_buffer pdf_header;
-    pdf_buffer info_obj, catalog_obj, pages_obj, page1_obj;
-    pdf_buffer fontsdict_obj;
-    pdf_buffer graph_stream;
-} pdf_state;
-
-static void pdf_init_buffer(
-    pdf_state *state,
-    pdf_buffer *buf)
-{
-    int       initial_size = 32;
-
-    buf->state = state;
-    buf->id = -42;
-    buf->alloc_size = 0;
-    buf->current_size = 0;
-    buf->data = (char *) malloc(initial_size);
-    buf->is_obj = 0;
-    buf->previous_buffer = NULL;
-    buf->next_buffer = NULL;
-    if (buf->data == NULL) {
-        rrd_set_error("malloc for pdf_buffer data");
-        state->has_failed = 1;
-        return;
-    }
-    buf->alloc_size = initial_size;
-    if (state->last_buffer)
-        state->last_buffer->next_buffer = buf;
-    if (state->first_buffer == NULL)
-        state->first_buffer = buf;
-    buf->previous_buffer = state->last_buffer;
-    state->last_buffer = buf;
-}
-
-static void pdf_put(
-    pdf_buffer *buf,
-    const char *text,
-    int len)
-{
-    if (len <= 0)
-        return;
-    if (buf->alloc_size < buf->current_size + len) {
-        int       new_size = buf->alloc_size;
-        char     *new_buf;
-
-        while (new_size < buf->current_size + len)
-            new_size *= 4;
-        new_buf = (char *) malloc(new_size);
-        if (new_buf == NULL) {
-            rrd_set_error("re-malloc for pdf_buffer data");
-            buf->state->has_failed = 1;
-            return;
-        }
-        memcpy(new_buf, buf->data, buf->current_size);
-        free(buf->data);
-        buf->data = new_buf;
-        buf->alloc_size = new_size;
-    }
-    memcpy(buf->data + buf->current_size, text, len);
-    buf->current_size += len;
-}
-
-static void pdf_put_char(
-    pdf_buffer *buf,
-    char c)
-{
-    if (buf->alloc_size >= buf->current_size + 1) {
-        buf->data[buf->current_size++] = c;
-    } else {
-        char      tmp[1];
-
-        tmp[0] = (char) c;
-        pdf_put(buf, tmp, 1);
-    }
-}
-
-static void pdf_puts(
-    pdf_buffer *buf,
-    const char *text)
-{
-    pdf_put(buf, text, strlen(text));
-}
-
-static void pdf_indent(
-    pdf_buffer *buf)
-{
-    pdf_puts(buf, "\t");
-}
-
-static void pdf_putsi(
-    pdf_buffer *buf,
-    const char *text)
-{
-    pdf_indent(buf);
-    pdf_puts(buf, text);
-}
-
-static void pdf_putint(
-    pdf_buffer *buf,
-    int i)
-{
-    char      tmp[20];
-
-    sprintf(tmp, "%d", i);
-    pdf_puts(buf, tmp);
-}
-
-static void pdf_putnumber(
-    pdf_buffer *buf,
-    double d)
-{
-    char      tmp[50];
-
-    svg_format_number(tmp, sizeof(tmp), d);
-    pdf_puts(buf, tmp);
-}
-
-static void pdf_put_string_contents_wide(
-    pdf_buffer *buf,
-    const afm_char * text)
-{
-    const afm_char *p = text;
-
-    while (1) {
-        afm_char  ch = *p;
-
-        ch = afm_fix_osx_charset(ch);   /* unsafe macro */
-        switch (ch) {
-        case 0:
-            return;
-        case '(':
-            pdf_puts(buf, "\\(");
-            break;
-        case ')':
-            pdf_puts(buf, "\\)");
-            break;
-        case '\\':
-            pdf_puts(buf, "\\\\");
-            break;
-        case '\n':
-            pdf_puts(buf, "\\n");
-            break;
-        case '\r':
-            pdf_puts(buf, "\\r");
-            break;
-        case '\t':
-            pdf_puts(buf, "\\t");
-            break;
-        default:
-            if (ch > 255) {
-                pdf_put_char(buf, '?');
-            } else if (ch > 125 || ch < 32) {
-                pdf_put_char(buf, ch);
-            } else {
-                char      tmp[10];
-
-                snprintf(tmp, sizeof(tmp), "\\%03o", (int) ch);
-                pdf_puts(buf, tmp);
-            }
-        }
-        p++;
-    }
-}
-
-static void pdf_put_string_contents(
-    pdf_buffer *buf,
-    const char *text)
-{
-#ifdef HAVE_MBSTOWCS
-    size_t    clen = strlen(text) + 1;
-    wchar_t  *cstr = malloc(sizeof(wchar_t) * clen);
-    int       text_count = mbstowcs(cstr, text, clen);
-
-    if (text_count == -1)
-        text_count = mbstowcs(cstr, "Enc-Err", 6);
-    pdf_put_string_contents_wide(buf, cstr);
-#if 0
-    if (*text == 'W') {
-        fprintf(stderr, "Decoding utf8 for '%s'\n", text);
-        wchar_t  *p = cstr;
-        char     *pp = text;
-
-        fprintf(stderr, "sz wc = %d\n", sizeof(wchar_t));
-        while (*p) {
-            fprintf(stderr, "  %d = %c  versus %d = %c\n", *p, (char) *p,
-                    255 & (int) *pp, *pp);
-            p++;
-            pp++;
-        }
-    }
-#endif
-    free(cstr);
-#else
-    pdf_put_string_contents_wide(buf, text);
-#endif
-}
-
-static void pdf_init_object(
-    pdf_state *state,
-    pdf_buffer *buf)
-{
-    pdf_init_buffer(state, buf);
-    buf->id = ++state->last_obj_id;
-    buf->is_obj = 1;
-    buf->is_stream = 0;
-}
-
-static void pdf_init_dict(
-    pdf_state *state,
-    pdf_buffer *buf)
-{
-    pdf_init_object(state, buf);
-    buf->is_dict = 1;
-}
-
-static void pdf_set_color(
-    pdf_buffer *buf,
-    gfx_color_t color,
-    gfx_color_t *current_color,
-    const char *op)
-{
-#if USE_PDF_FAKE_ALPHA
-    double    a1, a2;
-#endif
-    /* gfx_color_t is RRGGBBAA */
-    if (*current_color == color)
-        return;
-#if USE_PDF_FAKE_ALPHA
-    a1 = (color & 255) / 255.0;
-    a2 = 1 - a1;
-#define pdf_color_calc(x) ( ((x)  & 255) / 255.0 * a1 + a2)
-#else
-#define pdf_color_calc(x) ( ((x)  & 255) / 255.0)
-#endif
-    pdf_putnumber(buf, pdf_color_calc(color >> 24));
-    pdf_puts(buf, " ");
-    pdf_putnumber(buf, pdf_color_calc(color >> 16));
-    pdf_puts(buf, " ");
-    pdf_putnumber(buf, pdf_color_calc(color >> 8));
-    pdf_puts(buf, " ");
-    pdf_puts(buf, op);
-    pdf_puts(buf, "\n");
-    *current_color = color;
-}
-
-static void pdf_set_stroke_color(
-    pdf_buffer *buf,
-    gfx_color_t color)
-{
-    pdf_set_color(buf, color, &buf->state->stroke_color, "RG");
-}
-
-static void pdf_set_fill_color(
-    pdf_buffer *buf,
-    gfx_color_t color)
-{
-    pdf_set_color(buf, color, &buf->state->fill_color, "rg");
-}
-
-static pdf_font *pdf_find_font(
-    pdf_state *state,
-    gfx_node_t *node)
-{
-    const char *ps_font = afm_get_font_postscript_name(node->filename);
-    pdf_font *ef;
-
-    for (ef = state->font_list; ef; ef = ef->next) {
-        if (!strcmp(ps_font, ef->ps_font))
-            return ef;
-    }
-    return NULL;
-}
-
-static void pdf_add_font(
-    pdf_state *state,
-    gfx_node_t *node)
-{
-    pdf_font *ef = pdf_find_font(state, node);
-
-    if (ef)
-        return;
-    ef = malloc(sizeof(pdf_font));
-    if (ef == NULL) {
-        rrd_set_error("malloc for pdf_font");
-        state->has_failed = 1;
-        return;
-    }
-    pdf_init_dict(state, &ef->obj);
-    ef->next = state->font_list;
-    ef->ps_font = afm_get_font_postscript_name(node->filename);
-    state->font_list = ef;
-    /* fonts dict */
-    pdf_putsi(&state->fontsdict_obj, "/F");
-    pdf_putint(&state->fontsdict_obj, ef->obj.id);
-    pdf_puts(&state->fontsdict_obj, " ");
-    pdf_putint(&state->fontsdict_obj, ef->obj.id);
-    pdf_puts(&state->fontsdict_obj, " 0 R\n");
-    /* fonts def */
-    pdf_putsi(&ef->obj, "/Type /Font\n");
-    pdf_putsi(&ef->obj, "/Subtype /Type1\n");
-    pdf_putsi(&ef->obj, "/Name /F");
-    pdf_putint(&ef->obj, ef->obj.id);
-    pdf_puts(&ef->obj, "\n");
-    pdf_putsi(&ef->obj, "/BaseFont /");
-    pdf_puts(&ef->obj, ef->ps_font);
-    pdf_puts(&ef->obj, "\n");
-    pdf_putsi(&ef->obj, "/Encoding /WinAnsiEncoding\n");
-    /*  'Cp1252' (this is latin 1 extended with 27 characters;
-       the encoding is also known as 'winansi')
-       http://www.lowagie.com/iText/tutorial/ch09.html */
-}
-
-static void pdf_create_fonts(
-    pdf_state *state)
-{
-    gfx_node_t *node;
-
-    for (node = state->canvas->firstnode; node; node = node->next) {
-        if (node->type == GFX_TEXT)
-            pdf_add_font(state, node);
-    }
-}
-
-static void pdf_write_linearea(
-    pdf_state *state,
-    gfx_node_t *node)
-{
-    int       i;
-    pdf_buffer *s = &state->graph_stream;
-
-    if (node->type == GFX_LINE) {
-        svg_dash  dash_info;
-
-        svg_get_dash(node, &dash_info);
-        if (!svg_dash_equal(&dash_info, &state->dash)) {
-            state->dash = dash_info;
-            if (dash_info.dash_enable) {
-                pdf_puts(s, "[");
-                pdf_putnumber(s, dash_info.adjusted_on);
-                pdf_puts(s, " ");
-                pdf_putnumber(s, dash_info.adjusted_off);
-                pdf_puts(s, "] ");
-                pdf_putnumber(s, dash_info.dash_offset);
-                pdf_puts(s, " d\n");
-            } else {
-                pdf_puts(s, "[] 0 d\n");
-            }
-        }
-        pdf_set_stroke_color(s, node->color);
-        if (state->linecap != 1) {
-            pdf_puts(s, "1 j\n");
-            state->linecap = 1;
-        }
-        if (state->linejoin != 1) {
-            pdf_puts(s, "1 J\n");
-            state->linejoin = 1;
-        }
-        if (node->size != state->line_width) {
-            state->line_width = node->size;
-            pdf_putnumber(s, state->line_width);
-            pdf_puts(s, " w\n");
-        }
-    } else {
-        pdf_set_fill_color(s, node->color);
-    }
-    for (i = 0; i < node->points; i++) {
-        ArtVpath *vec = node->path + i;
-        double    x = vec->x;
-        double    y = state->page_height - vec->y;
-
-        if (node->type == GFX_AREA) {
-            x += LINEOFFSET;    /* adjust for libart handling of areas */
-            y -= LINEOFFSET;
-        }
-        switch (vec->code) {
-        case ART_MOVETO_OPEN:  /* fall-through */
-        case ART_MOVETO:
-            pdf_putnumber(s, x);
-            pdf_puts(s, " ");
-            pdf_putnumber(s, y);
-            pdf_puts(s, " m\n");
-            break;
-        case ART_LINETO:
-            pdf_putnumber(s, x);
-            pdf_puts(s, " ");
-            pdf_putnumber(s, y);
-            pdf_puts(s, " l\n");
-            break;
-        case ART_CURVETO:
-            break;      /* unsupported */
-        case ART_END:
-            break;      /* nop */
-        }
-    }
-    if (node->type == GFX_LINE) {
-        pdf_puts(s, node->closed_path ? "s\n" : "S\n");
-    } else {
-        pdf_puts(s, "f\n");
-    }
-}
-
-
-static void pdf_write_matrix(
-    pdf_state *state,
-    gfx_node_t *node,
-    pdf_coords * g,
-    int useTM)
-{
-    char      tmp[150];
-    pdf_buffer *s = &state->graph_stream;
-
-    if (node->angle == 0) {
-        pdf_puts(s, "1 0 0 1 ");
-        pdf_putnumber(s, useTM ? g->tmx : g->mx);
-        pdf_puts(s, " ");
-        pdf_putnumber(s, useTM ? g->tmy : g->my);
-    } else {
-        /* can't use svg_write_number as 2 decimals is far from enough to avoid
-           skewed text */
-        sprintf(tmp, "%f %f %f %f %f %f",
-                g->ma, g->mb, g->mc, g->md,
-                useTM ? g->tmx : g->mx, useTM ? g->tmy : g->my);
-        pdf_puts(s, tmp);
-    }
-}
-
-static void pdf_write_text(
-    pdf_state *state,
-    gfx_node_t *node,
-    int last_was_text,
-    int next_is_text)
-{
-    pdf_coords g;
-    pdf_buffer *s = &state->graph_stream;
-    pdf_font *font = pdf_find_font(state, node);
-
-    if (font == NULL) {
-        rrd_set_error("font disappeared");
-        state->has_failed = 1;
-        return;
-    }
-    pdf_calc(state->page_height, node, &g);
-#if PDF_CALC_DEBUG
-    pdf_puts(s, "q % debug green box\n");
-    pdf_write_matrix(state, node, &g, 0);
-    pdf_puts(s, " cm\n");
-    pdf_set_fill_color(s, 0x90FF9000);
-    pdf_puts(s, "0 0.4 0 rg\n");
-    pdf_puts(s, "0 0 ");
-    pdf_putnumber(s, g.sizep.x);
-    pdf_puts(s, " ");
-    pdf_putnumber(s, g.sizep.y);
-    pdf_puts(s, " re\n");
-    pdf_puts(s, "f\n");
-    pdf_puts(s, "Q\n");
-#endif
-    pdf_set_fill_color(s, node->color);
-    if (PDF_CALC_DEBUG || !last_was_text)
-        pdf_puts(s, "BT\n");
-    if (state->font_id != font->obj.id || node->size != state->font_size) {
-        state->font_id = font->obj.id;
-        state->font_size = node->size;
-        pdf_puts(s, "/F");
-        pdf_putint(s, font->obj.id);
-        pdf_puts(s, " ");
-        pdf_putnumber(s, node->size);
-        pdf_puts(s, " Tf\n");
-    }
-    pdf_write_matrix(state, node, &g, 1);
-    pdf_puts(s, " Tm\n");
-    pdf_puts(s, "(");
-    pdf_put_string_contents(s, node->text);
-    pdf_puts(s, ") Tj\n");
-    if (PDF_CALC_DEBUG || !next_is_text)
-        pdf_puts(s, "ET\n");
-}
-
-static void pdf_write_content(
-    pdf_state *state)
-{
-    gfx_node_t *node;
-    int       last_was_text = 0, next_is_text;
-
-    for (node = state->canvas->firstnode; node; node = node->next) {
-        switch (node->type) {
-        case GFX_LINE:
-        case GFX_AREA:
-            pdf_write_linearea(state, node);
-            break;
-        case GFX_TEXT:
-            next_is_text = node->next && node->next->type == GFX_TEXT;
-            pdf_write_text(state, node, last_was_text, next_is_text);
-            break;
-        }
-        last_was_text = node->type == GFX_TEXT;
-    }
-}
-
-static void pdf_init_document(
-    pdf_state *state)
-{
-    pdf_init_buffer(state, &state->pdf_header);
-    pdf_init_dict(state, &state->catalog_obj);
-    pdf_init_dict(state, &state->info_obj);
-    pdf_init_dict(state, &state->pages_obj);
-    pdf_init_dict(state, &state->page1_obj);
-    pdf_init_dict(state, &state->fontsdict_obj);
-    pdf_create_fonts(state);
-    if (state->has_failed)
-        return;
-    /* make stream last object in file */
-    pdf_init_object(state, &state->graph_stream);
-    state->graph_stream.is_stream = 1;
-}
-
-static void pdf_setup_document(
-    pdf_state *state)
-{
-    const char *creator =
-        "RRDtool " PACKAGE_VERSION " Tobias Oetiker, http://tobi.oetiker.ch";
-    /* all objects created by now, so init code can reference them */
-    /* HEADER */
-    pdf_puts(&state->pdf_header, "%PDF-1.3\n");
-    /* following 8 bit comment is recommended by Adobe for
-       indicating binary file to file transfer applications */
-    pdf_puts(&state->pdf_header, "%\xE2\xE3\xCF\xD3\n");
-    /* INFO */
-    pdf_putsi(&state->info_obj, "/Creator (");
-    pdf_put_string_contents(&state->info_obj, creator);
-    pdf_puts(&state->info_obj, ")\n");
-    /* CATALOG */
-    pdf_putsi(&state->catalog_obj, "/Type /Catalog\n");
-    pdf_putsi(&state->catalog_obj, "/Pages ");
-    pdf_putint(&state->catalog_obj, state->pages_obj.id);
-    pdf_puts(&state->catalog_obj, " 0 R\n");
-    /* PAGES */
-    pdf_putsi(&state->pages_obj, "/Type /Pages\n");
-    pdf_putsi(&state->pages_obj, "/Kids [");
-    pdf_putint(&state->pages_obj, state->page1_obj.id);
-    pdf_puts(&state->pages_obj, " 0 R]\n");
-    pdf_putsi(&state->pages_obj, "/Count 1\n");
-    /* PAGE 1 */
-    pdf_putsi(&state->page1_obj, "/Type /Page\n");
-    pdf_putsi(&state->page1_obj, "/Parent ");
-    pdf_putint(&state->page1_obj, state->pages_obj.id);
-    pdf_puts(&state->page1_obj, " 0 R\n");
-    pdf_putsi(&state->page1_obj, "/MediaBox [0 0 ");
-    pdf_putint(&state->page1_obj, state->page_width);
-    pdf_puts(&state->page1_obj, " ");
-    pdf_putint(&state->page1_obj, state->page_height);
-    pdf_puts(&state->page1_obj, "]\n");
-    pdf_putsi(&state->page1_obj, "/Contents ");
-    pdf_putint(&state->page1_obj, state->graph_stream.id);
-    pdf_puts(&state->page1_obj, " 0 R\n");
-    pdf_putsi(&state->page1_obj, "/Resources << /Font ");
-    pdf_putint(&state->page1_obj, state->fontsdict_obj.id);
-    pdf_puts(&state->page1_obj, " 0 R >>\n");
-}
-
-static void pdf_write_string_to_file(
-    pdf_state *state,
-    const char *text)
-{
-    fputs(text, state->fp);
-    state->pdf_file_pos += strlen(text);
-}
-
-static void pdf_write_buf_to_file(
-    pdf_state *state,
-    pdf_buffer *buf)
-{
-    char      tmp[40];
-
-    buf->pdf_file_pos = state->pdf_file_pos;
-    if (buf->is_obj) {
-        snprintf(tmp, sizeof(tmp), "%d 0 obj\n", buf->id);
-        pdf_write_string_to_file(state, tmp);
-    }
-    if (buf->is_dict)
-        pdf_write_string_to_file(state, "<<\n");
-    if (buf->is_stream) {
-        snprintf(tmp, sizeof(tmp), "<< /Length %d >>\n", buf->current_size);
-        pdf_write_string_to_file(state, tmp);
-        pdf_write_string_to_file(state, "stream\n");
-    }
-    fwrite(buf->data, 1, buf->current_size, state->fp);
-    state->pdf_file_pos += buf->current_size;
-    if (buf->is_stream)
-        pdf_write_string_to_file(state, "endstream\n");
-    if (buf->is_dict)
-        pdf_write_string_to_file(state, ">>\n");
-    if (buf->is_obj)
-        pdf_write_string_to_file(state, "endobj\n");
-}
-
-static void pdf_write_to_file(
-    pdf_state *state)
-{
-    pdf_buffer *buf = state->first_buffer;
-    int       xref_pos;
-
-    state->pdf_file_pos = 0;
-    pdf_write_buf_to_file(state, &state->pdf_header);
-    while (buf) {
-        if (buf->is_obj)
-            pdf_write_buf_to_file(state, buf);
-        buf = buf->next_buffer;
-    }
-    xref_pos = state->pdf_file_pos;
-    fprintf(state->fp, "xref\n");
-    fprintf(state->fp, "%d %d\n", 0, state->last_obj_id + 1);
-    /* TOC lines must be exactly 20 bytes including \n */
-    fprintf(state->fp, "%010d %05d f\x20\n", 0, 65535);
-    for (buf = state->first_buffer; buf; buf = buf->next_buffer) {
-        if (buf->is_obj)
-            fprintf(state->fp, "%010d %05d n\x20\n", buf->pdf_file_pos, 0);
-    }
-    fprintf(state->fp, "trailer\n");
-    fprintf(state->fp, "<<\n");
-    fprintf(state->fp, "\t/Size %d\n", state->last_obj_id + 1);
-    fprintf(state->fp, "\t/Root %d 0 R\n", state->catalog_obj.id);
-    fprintf(state->fp, "\t/Info %d 0 R\n", state->info_obj.id);
-    fprintf(state->fp, ">>\n");
-    fprintf(state->fp, "startxref\n");
-    fprintf(state->fp, "%d\n", xref_pos);
-    fputs("%%EOF\n", state->fp);
-}
-
-static void pdf_free_resources(
-    pdf_state *state)
-{
-    pdf_buffer *buf = state->first_buffer;
-
-    while (buf) {
-        free(buf->data);
-        buf->data = NULL;
-        buf->alloc_size = buf->current_size = 0;
-        buf = buf->next_buffer;
-    }
-    while (state->font_list) {
-        pdf_font *next = state->font_list->next;
-
-        free(state->font_list);
-        state->font_list = next;
-    }
-}
-
-int gfx_render_pdf(
-    gfx_canvas_t *canvas,
-    art_u32 width,
-    art_u32 height,
-    gfx_color_t UNUSED(background),
-    FILE * fp)
-{
-    struct pdf_state state;
-
-    memset(&state, 0, sizeof(pdf_state));
-    state.fp = fp;
-    state.canvas = canvas;
-    state.page_width = width;
-    state.page_height = height;
-    state.font_id = -1;
-    state.font_size = -1;
-    state.font_list = NULL;
-    state.linecap = -1;
-    state.linejoin = -1;
-    pdf_init_document(&state);
-    /*
-       pdf_set_color(&state, background);
-       fprintf(fp, "0 0 M 0 %d L %d %d L %d 0 L fill\n",
-       height, width, height, width);
-     */
-    if (!state.has_failed)
-        pdf_write_content(&state);
-    if (!state.has_failed)
-        pdf_setup_document(&state);
-    if (!state.has_failed)
-        pdf_write_to_file(&state);
-    pdf_free_resources(&state);
-    return state.has_failed ? -1 : 0;
+    double    line_height;
+
+    cairo_user_to_device(cr, x, y);
+    line_width = cairo_get_line_width(cr);
+    line_height = line_width;
+    cairo_user_to_device_distance(cr, &line_width, &line_height);
+    line_width = line_width / 2.0 - (long) (line_width / 2.0);
+    line_height = line_height / 2.0 - (long) (line_height / 2.0);
+    *x = (double) ((long) (*x + 0.5)) + line_width;
+    *y = (double) ((long) (*y + 0.5)) + line_height;
+    cairo_device_to_user(cr, x, y);
+}
+
+/* gridfit_areas */
+
+void gfx_area_fit(
+    cairo_t * cr,
+    double *x,
+    double *y)
+{
+    cairo_user_to_device(cr, x, y);
+    *x = (double) ((long) (*x + 0.5));
+    *y = (double) ((long) (*y + 0.5));
+    cairo_device_to_user(cr, x, y);
 }
 }
index dacdd69..c3cd1e3 100644 (file)
@@ -4,64 +4,35 @@
  * rrd_gfx.h generic graphics adapter library
  ****************************************************************************/
 
  * rrd_gfx.h generic graphics adapter library
  ****************************************************************************/
 
-#ifndef  RRD_GFX_H
+#ifndef RRD_GFX_H
 #define RRD_GFX_H
 #define RRD_GFX_H
-#define LIBART_COMPILATION
 
 
-#define y0 libart_y0
-#define y1 libart_y1
-#define gamma libart_gamma
-#include <libart_lgpl/libart.h>
-#include <libart_lgpl/art_rgba.h>
-#include "art_rgba_svp.h"
-#undef gamma
-#undef y0
-#undef y1
+#define y0 cairo_y0
+#define y1 cairo_y1
+#define index cairo_index
 
 
+#include <cairo-pdf.h>
+#include <cairo-svg.h>
+#include <cairo-ps.h>
+#include <pango/pangocairo.h>
 
 enum gfx_if_en { IF_PNG = 0, IF_SVG, IF_EPS, IF_PDF };
 enum gfx_en { GFX_LINE = 0, GFX_AREA, GFX_TEXT };
 enum gfx_h_align_en { GFX_H_NULL = 0, GFX_H_LEFT, GFX_H_RIGHT, GFX_H_CENTER };
 enum gfx_v_align_en { GFX_V_NULL = 0, GFX_V_TOP, GFX_V_BOTTOM, GFX_V_CENTER };
 
 enum gfx_if_en { IF_PNG = 0, IF_SVG, IF_EPS, IF_PDF };
 enum gfx_en { GFX_LINE = 0, GFX_AREA, GFX_TEXT };
 enum gfx_h_align_en { GFX_H_NULL = 0, GFX_H_LEFT, GFX_H_RIGHT, GFX_H_CENTER };
 enum gfx_v_align_en { GFX_V_NULL = 0, GFX_V_TOP, GFX_V_BOTTOM, GFX_V_CENTER };
-enum gfx_aa_type_en { AA_NORMAL = 0, AA_LIGHT, AA_NONE };
-typedef unsigned long gfx_color_t;
-
-typedef struct gfx_node_t {
-    enum gfx_en type;   /* type of graph element */
-    gfx_color_t color;  /* color of element  0xRRGGBBAA  alpha 0xff is solid */
-    double    size;     /* font size, line width */
-    double    dash_on, dash_off;    /* dash line fragments lengths */
-    int       closed_path;
-    int       points;
-    int       points_max;
-    char     *filename; /* font or image filename */
-    char     *text;
-    ArtVpath *path;     /* path */
-    double    x, y;     /* position */
-    double    angle;    /* text angle */
-    enum gfx_h_align_en halign; /* text alignement */
-    enum gfx_v_align_en valign; /* text alignement */
-    double    tabwidth;
-    struct gfx_node_t *next;
-} gfx_node_t;
-
-
-typedef struct gfx_canvas_t {
-    struct gfx_node_t *firstnode;
-    struct gfx_node_t *lastnode;
-    enum gfx_if_en imgformat;   /* image format */
-    int       interlaced;   /* will the graph be interlaced? */
-    double    zoom;     /* zoom for graph */
-    double    font_aa_threshold;    /* no anti-aliasing for sizes <= */
-    enum gfx_aa_type_en aa_type;    /* anti-aliasing type (normal/light/none) */
-} gfx_canvas_t;
-
-gfx_canvas_t *gfx_new_canvas(
-    void);
+
+/* cairo color components */
+typedef struct gfx_color_t {
+    double    red;
+    double    green;
+    double    blue;
+    double    alpha;
+} gfx_color_t;
+
 
 /* create a new line */
 
 /* create a new line */
-gfx_node_t *gfx_new_line(
-    gfx_canvas_t *canvas,
+void      gfx_line(
+    cairo_t * cr,
     double X0,
     double Y0,
     double X1,
     double X0,
     double Y0,
     double X1,
@@ -69,8 +40,8 @@ gfx_node_t *gfx_new_line(
     double width,
     gfx_color_t color);
 
     double width,
     gfx_color_t color);
 
-gfx_node_t *gfx_new_dashed_line(
-    gfx_canvas_t *canvas,
+void      gfx_dashed_line(
+    cairo_t * cr,
     double X0,
     double Y0,
     double X1,
     double X0,
     double Y0,
     double X1,
@@ -81,8 +52,8 @@ gfx_node_t *gfx_new_dashed_line(
     double dash_off);
 
 /* create a new area */
     double dash_off);
 
 /* create a new area */
-gfx_node_t *gfx_new_area(
-    gfx_canvas_t *canvas,
+void      gfx_new_area(
+    cairo_t * cr,
     double X0,
     double Y0,
     double X1,
     double X0,
     double Y0,
     double X1,
@@ -92,19 +63,19 @@ gfx_node_t *gfx_new_area(
     gfx_color_t color);
 
 /* add a point to a line or to an area */
     gfx_color_t color);
 
 /* add a point to a line or to an area */
-int       gfx_add_point(
-    gfx_node_t *node,
+void      gfx_add_point(
+    cairo_t * cr,
     double x,
     double y);
 
 /* close current path so it ends at the same point as it started */
 void      gfx_close_path(
     double x,
     double y);
 
 /* close current path so it ends at the same point as it started */
 void      gfx_close_path(
-    gfx_node_t *node);
+    cairo_t * cr);
 
 
 /* create a text node */
 
 
 /* create a text node */
-gfx_node_t *gfx_new_text(
-    gfx_canvas_t *canvas,
+void      gfx_text(
+    cairo_t * cr,
     double x,
     double y,
     gfx_color_t color,
     double x,
     double y,
     gfx_color_t color,
@@ -114,70 +85,27 @@ gfx_node_t *gfx_new_text(
     double angle,
     enum gfx_h_align_en h_align,
     enum gfx_v_align_en v_align,
     double angle,
     enum gfx_h_align_en h_align,
     enum gfx_v_align_en v_align,
-    char *text);
+    const char *text);
 
 /* measure width of a text string */
 double    gfx_get_text_width(
 
 /* measure width of a text string */
 double    gfx_get_text_width(
-    gfx_canvas_t *canvas,
+    cairo_t * cr,
     double start,
     char *font,
     double size,
     double tabwidth,
     double start,
     char *font,
     double size,
     double tabwidth,
-    char *text,
-    int rotation);
-
-/* save image to file */
-int       gfx_render(
-    gfx_canvas_t *canvas,
-    art_u32 width,
-    art_u32 height,
-    gfx_color_t background,
-    FILE * fo);
-
-/* free memory used by nodes this will also remove memory required for
-   node chain and associated material */
-int       gfx_destroy(
-    gfx_canvas_t *canvas);
-
-
-/* PNG support*/
-int       gfx_render_png(
-    gfx_canvas_t *canvas,
-    art_u32 width,
-    art_u32 height,
-    gfx_color_t background,
-    FILE * fo);
-double    gfx_get_text_width_libart(
-    gfx_canvas_t *canvas,
-    double start,
-    char *font,
-    double size,
-    double tabwidth,
-    char *text,
-    int rotation);
-
-/* SVG support */
-int       gfx_render_svg(
-    gfx_canvas_t *canvas,
-    art_u32 width,
-    art_u32 height,
-    gfx_color_t background,
-    FILE * fo);
-
-/* EPS support */
-int       gfx_render_eps(
-    gfx_canvas_t *canvas,
-    art_u32 width,
-    art_u32 height,
-    gfx_color_t background,
-    FILE * fo);
-
-/* PDF support */
-int       gfx_render_pdf(
-    gfx_canvas_t *canvas,
-    art_u32 width,
-    art_u32 height,
-    gfx_color_t background,
-    FILE * fo);
+    char *text);
+
 
 
+/* convert color */
+gfx_color_t gfx_hex_to_col(
+    long unsigned int);
+void      gfx_line_fit(
+    cairo_t *,
+    double *,
+    double *);
+void      gfx_area_fit(
+    cairo_t *,
+    double *,
+    double *);
 #endif
 #endif
index f9c7a11..d23d071 100644 (file)
@@ -140,16 +140,17 @@ ylab_t    ylab[] = {
 
 
 gfx_color_t graph_col[] =   /* default colors */
 
 
 gfx_color_t graph_col[] =   /* default colors */
-{ 0xFFFFFFFF,           /* canvas     */
-    0xF0F0F0FF,         /* background */
-    0xD0D0D0FF,         /* shade A    */
-    0xA0A0A0FF,         /* shade B    */
-    0x90909080,         /* grid       */
-    0xE0505080,         /* major grid */
-    0x000000FF,         /* font       */
-    0x802020FF,         /* arrow      */
-    0x202020FF,         /* axis       */
-    0x000000FF          /* frame      */
+{
+    {1.00, 1.00, 1.00, 1.00},   /* canvas     */
+    {0.95, 0.95, 0.95, 1.00},   /* background */
+    {0.81, 0.81, 0.81, 1.00},   /* shade A    */
+    {0.62, 0.62, 0.62, 1.00},   /* shade B    */
+    {0.56, 0.56, 0.56, 0.75},   /* grid       */
+    {0.87, 0.31, 0.31, 0.60},   /* major grid */
+    {0.00, 0.00, 0.00, 1.00},   /* font       */
+    {0.50, 0.12, 0.12, 1.00},   /* arrow      */
+    {0.12, 0.12, 0.12, 1.00},   /* axis       */
+    {0.00, 0.00, 0.00, 1.00}    /* frame      */
 };
 
 
 };
 
 
@@ -225,81 +226,78 @@ enum gf_en gf_conv(
     char *string)
 {
 
     char *string)
 {
 
-    conv_if(PRINT, GF_PRINT)
-        conv_if(GPRINT, GF_GPRINT)
-        conv_if(COMMENT, GF_COMMENT)
-        conv_if(HRULE, GF_HRULE)
-        conv_if(VRULE, GF_VRULE)
-        conv_if(LINE, GF_LINE)
-        conv_if(AREA, GF_AREA)
-        conv_if(STACK, GF_STACK)
-        conv_if(TICK, GF_TICK)
-        conv_if(DEF, GF_DEF)
-        conv_if(CDEF, GF_CDEF)
-        conv_if(VDEF, GF_VDEF)
-#ifdef WITH_PIECHART
-        conv_if(PART, GF_PART)
-#endif
-        conv_if(XPORT, GF_XPORT)
-        conv_if(SHIFT, GF_SHIFT)
-
-        return (-1);
+    conv_if(PRINT, GF_PRINT);
+    conv_if(GPRINT, GF_GPRINT);
+    conv_if(COMMENT, GF_COMMENT);
+    conv_if(HRULE, GF_HRULE);
+    conv_if(VRULE, GF_VRULE);
+    conv_if(LINE, GF_LINE);
+    conv_if(AREA, GF_AREA);
+    conv_if(STACK, GF_STACK);
+    conv_if(TICK, GF_TICK);
+    conv_if(DEF, GF_DEF);
+    conv_if(CDEF, GF_CDEF);
+    conv_if(VDEF, GF_VDEF);
+    conv_if(XPORT, GF_XPORT);
+    conv_if(SHIFT, GF_SHIFT);
+
+    return (-1);
 }
 
 enum gfx_if_en if_conv(
     char *string)
 {
 
 }
 
 enum gfx_if_en if_conv(
     char *string)
 {
 
-    conv_if(PNG, IF_PNG)
-        conv_if(SVG, IF_SVG)
-        conv_if(EPS, IF_EPS)
-        conv_if(PDF, IF_PDF)
+    conv_if(PNG, IF_PNG);
+    conv_if(SVG, IF_SVG);
+    conv_if(EPS, IF_EPS);
+    conv_if(PDF, IF_PDF);
 
 
-        return (-1);
+    return (-1);
 }
 
 enum tmt_en tmt_conv(
     char *string)
 {
 
 }
 
 enum tmt_en tmt_conv(
     char *string)
 {
 
-    conv_if(SECOND, TMT_SECOND)
-        conv_if(MINUTE, TMT_MINUTE)
-        conv_if(HOUR, TMT_HOUR)
-        conv_if(DAY, TMT_DAY)
-        conv_if(WEEK, TMT_WEEK)
-        conv_if(MONTH, TMT_MONTH)
-        conv_if(YEAR, TMT_YEAR)
-        return (-1);
+    conv_if(SECOND, TMT_SECOND);
+    conv_if(MINUTE, TMT_MINUTE);
+    conv_if(HOUR, TMT_HOUR);
+    conv_if(DAY, TMT_DAY);
+    conv_if(WEEK, TMT_WEEK);
+    conv_if(MONTH, TMT_MONTH);
+    conv_if(YEAR, TMT_YEAR);
+    return (-1);
 }
 
 enum grc_en grc_conv(
     char *string)
 {
 
 }
 
 enum grc_en grc_conv(
     char *string)
 {
 
-    conv_if(BACK, GRC_BACK)
-        conv_if(CANVAS, GRC_CANVAS)
-        conv_if(SHADEA, GRC_SHADEA)
-        conv_if(SHADEB, GRC_SHADEB)
-        conv_if(GRID, GRC_GRID)
-        conv_if(MGRID, GRC_MGRID)
-        conv_if(FONT, GRC_FONT)
-        conv_if(ARROW, GRC_ARROW)
-        conv_if(AXIS, GRC_AXIS)
-        conv_if(FRAME, GRC_FRAME)
+    conv_if(BACK, GRC_BACK);
+    conv_if(CANVAS, GRC_CANVAS);
+    conv_if(SHADEA, GRC_SHADEA);
+    conv_if(SHADEB, GRC_SHADEB);
+    conv_if(GRID, GRC_GRID);
+    conv_if(MGRID, GRC_MGRID);
+    conv_if(FONT, GRC_FONT);
+    conv_if(ARROW, GRC_ARROW);
+    conv_if(AXIS, GRC_AXIS);
+    conv_if(FRAME, GRC_FRAME);
 
 
-        return -1;
+    return -1;
 }
 
 enum text_prop_en text_prop_conv(
     char *string)
 {
 
 }
 
 enum text_prop_en text_prop_conv(
     char *string)
 {
 
-    conv_if(DEFAULT, TEXT_PROP_DEFAULT)
-        conv_if(TITLE, TEXT_PROP_TITLE)
-        conv_if(AXIS, TEXT_PROP_AXIS)
-        conv_if(UNIT, TEXT_PROP_UNIT)
-        conv_if(LEGEND, TEXT_PROP_LEGEND)
-        return -1;
+    conv_if(DEFAULT, TEXT_PROP_DEFAULT);
+    conv_if(TITLE, TEXT_PROP_TITLE);
+    conv_if(AXIS, TEXT_PROP_AXIS);
+    conv_if(UNIT, TEXT_PROP_UNIT);
+    conv_if(LEGEND, TEXT_PROP_LEGEND);
+    return -1;
 }
 
 
 }
 
 
@@ -326,7 +324,8 @@ int im_free(
         free(im->gdes[i].rpnp);
     }
     free(im->gdes);
         free(im->gdes[i].rpnp);
     }
     free(im->gdes);
-    gfx_destroy(im->canvas);
+    if (im->surface)
+        cairo_surface_destroy(im->surface);
     return 0;
 }
 
     return 0;
 }
 
@@ -520,6 +519,7 @@ void expand_range(
 #endif
 }
 
 #endif
 }
 
+
 void apply_gridfit(
     image_desc_t *im)
 {
 void apply_gridfit(
     image_desc_t *im)
 {
@@ -1638,12 +1638,12 @@ int leg_place(
                     /* no interleg space if string ends in \g */
                     fill += legspace[i];
                 }
                     /* no interleg space if string ends in \g */
                     fill += legspace[i];
                 }
-                fill += gfx_get_text_width(im->canvas, fill + border,
+                fill += gfx_get_text_width(im->cr, fill + border,
                                            im->text_prop[TEXT_PROP_LEGEND].
                                            font,
                                            im->text_prop[TEXT_PROP_LEGEND].
                                            size, im->tabwidth,
                                            im->text_prop[TEXT_PROP_LEGEND].
                                            font,
                                            im->text_prop[TEXT_PROP_LEGEND].
                                            size, im->tabwidth,
-                                           im->gdes[i].legend, 0);
+                                           im->gdes[i].legend);
                 leg_c++;
             } else {
                 legspace[i] = 0;
                 leg_c++;
             } else {
                 legspace[i] = 0;
@@ -1690,12 +1690,12 @@ int leg_place(
                     im->gdes[ii].leg_x = leg_x;
                     im->gdes[ii].leg_y = leg_y;
                     leg_x +=
                     im->gdes[ii].leg_x = leg_x;
                     im->gdes[ii].leg_y = leg_y;
                     leg_x +=
-                        gfx_get_text_width(im->canvas, leg_x,
+                        gfx_get_text_width(im->cr, leg_x,
                                            im->text_prop[TEXT_PROP_LEGEND].
                                            font,
                                            im->text_prop[TEXT_PROP_LEGEND].
                                            size, im->tabwidth,
                                            im->text_prop[TEXT_PROP_LEGEND].
                                            font,
                                            im->text_prop[TEXT_PROP_LEGEND].
                                            size, im->tabwidth,
-                                           im->gdes[ii].legend, 0)
+                                           im->gdes[ii].legend)
                         + legspace[ii]
                         + glue;
                 }
                         + legspace[ii]
                         + glue;
                 }
@@ -1900,25 +1900,37 @@ int draw_horizontal_grid(
                 }
                 nlabels++;
 
                 }
                 nlabels++;
 
-                gfx_new_text(im->canvas,
-                             X0 - im->text_prop[TEXT_PROP_AXIS].size, Y0,
-                             im->graph_col[GRC_FONT],
-                             im->text_prop[TEXT_PROP_AXIS].font,
-                             im->text_prop[TEXT_PROP_AXIS].size,
-                             im->tabwidth, 0.0, GFX_H_RIGHT, GFX_V_CENTER,
-                             graph_label);
-                gfx_new_dashed_line(im->canvas,
-                                    X0 - 2, Y0,
-                                    X1 + 2, Y0,
-                                    MGRIDWIDTH, im->graph_col[GRC_MGRID],
-                                    im->grid_dash_on, im->grid_dash_off);
+                gfx_text(im->cr,
+                         X0 - im->text_prop[TEXT_PROP_AXIS].size, Y0,
+                         im->graph_col[GRC_FONT],
+                         im->text_prop[TEXT_PROP_AXIS].font,
+                         im->text_prop[TEXT_PROP_AXIS].size,
+                         im->tabwidth, 0.0, GFX_H_RIGHT, GFX_V_CENTER,
+                         graph_label);
+                gfx_line(im->cr,
+                         X0 - 2, Y0,
+                         X0, Y0, MGRIDWIDTH, im->graph_col[GRC_MGRID]);
+                gfx_line(im->cr,
+                         X1, Y0,
+                         X1 + 2, Y0, MGRIDWIDTH, im->graph_col[GRC_MGRID]);
+                gfx_dashed_line(im->cr,
+                                X0 - 2, Y0,
+                                X1 + 2, Y0,
+                                MGRIDWIDTH, im->graph_col[GRC_MGRID],
+                                im->grid_dash_on, im->grid_dash_off);
 
             } else if (!(im->extra_flags & NOMINOR)) {
 
             } else if (!(im->extra_flags & NOMINOR)) {
-                gfx_new_dashed_line(im->canvas,
-                                    X0 - 1, Y0,
-                                    X1 + 1, Y0,
-                                    GRIDWIDTH, im->graph_col[GRC_GRID],
-                                    im->grid_dash_on, im->grid_dash_off);
+                gfx_line(im->cr,
+                         X0 - 2, Y0,
+                         X0, Y0, GRIDWIDTH, im->graph_col[GRC_GRID]);
+                gfx_line(im->cr,
+                         X1, Y0,
+                         X1 + 2, Y0, GRIDWIDTH, im->graph_col[GRC_GRID]);
+                gfx_dashed_line(im->cr,
+                                X0 - 1, Y0,
+                                X1 + 1, Y0,
+                                GRIDWIDTH, im->graph_col[GRC_GRID],
+                                im->grid_dash_on, im->grid_dash_off);
 
             }
         }
 
             }
         }
@@ -2056,11 +2068,18 @@ int horizontal_log_grid(
             break;
 
         /* major grid line */
             break;
 
         /* major grid line */
-        gfx_new_dashed_line(im->canvas,
-                            X0 - 2, Y0,
-                            X1 + 2, Y0,
-                            MGRIDWIDTH, im->graph_col[GRC_MGRID],
-                            im->grid_dash_on, im->grid_dash_off);
+
+        gfx_line(im->cr,
+                 X0 - 2, Y0, X0, Y0, MGRIDWIDTH, im->graph_col[GRC_MGRID]);
+        gfx_line(im->cr,
+                 X1, Y0, X1 + 2, Y0, MGRIDWIDTH, im->graph_col[GRC_MGRID]);
+
+
+        gfx_dashed_line(im->cr,
+                        X0 - 2, Y0,
+                        X1 + 2, Y0,
+                        MGRIDWIDTH, im->graph_col[GRC_MGRID],
+                        im->grid_dash_on, im->grid_dash_off);
 
         /* label */
         if (im->extra_flags & FORCE_UNITS_SI) {
 
         /* label */
         if (im->extra_flags & FORCE_UNITS_SI) {
@@ -2084,13 +2103,12 @@ int horizontal_log_grid(
             sprintf(graph_label, "%3.0f %c", pvalue, symbol);
         } else
             sprintf(graph_label, "%3.0e", value);
             sprintf(graph_label, "%3.0f %c", pvalue, symbol);
         } else
             sprintf(graph_label, "%3.0e", value);
-        gfx_new_text(im->canvas,
-                     X0 - im->text_prop[TEXT_PROP_AXIS].size, Y0,
-                     im->graph_col[GRC_FONT],
-                     im->text_prop[TEXT_PROP_AXIS].font,
-                     im->text_prop[TEXT_PROP_AXIS].size,
-                     im->tabwidth, 0.0, GFX_H_RIGHT, GFX_V_CENTER,
-                     graph_label);
+        gfx_text(im->cr,
+                 X0 - im->text_prop[TEXT_PROP_AXIS].size, Y0,
+                 im->graph_col[GRC_FONT],
+                 im->text_prop[TEXT_PROP_AXIS].font,
+                 im->text_prop[TEXT_PROP_AXIS].size,
+                 im->tabwidth, 0.0, GFX_H_RIGHT, GFX_V_CENTER, graph_label);
 
         /* minor grid */
         if (mid < 4 && exfrac == 1) {
 
         /* minor grid */
         if (mid < 4 && exfrac == 1) {
@@ -2119,11 +2137,17 @@ int horizontal_log_grid(
                     break;
 
                 /* draw lines */
                     break;
 
                 /* draw lines */
-                gfx_new_dashed_line(im->canvas,
-                                    X0 - 1, Y0,
-                                    X1 + 1, Y0,
-                                    GRIDWIDTH, im->graph_col[GRC_GRID],
-                                    im->grid_dash_on, im->grid_dash_off);
+                gfx_line(im->cr,
+                         X0 - 2, Y0,
+                         X0, Y0, GRIDWIDTH, im->graph_col[GRC_GRID]);
+                gfx_line(im->cr,
+                         X1, Y0,
+                         X1 + 2, Y0, GRIDWIDTH, im->graph_col[GRC_GRID]);
+                gfx_dashed_line(im->cr,
+                                X0 - 1, Y0,
+                                X1 + 1, Y0,
+                                GRIDWIDTH, im->graph_col[GRC_GRID],
+                                im->grid_dash_on, im->grid_dash_off);
             }
         } else if (exfrac > 1) {
             for (i = val_exp - exfrac / 3 * 2; i < val_exp; i += exfrac / 3) {
             }
         } else if (exfrac > 1) {
             for (i = val_exp - exfrac / 3 * 2; i < val_exp; i += exfrac / 3) {
@@ -2136,11 +2160,17 @@ int horizontal_log_grid(
                     break;
 
                 /* draw lines */
                     break;
 
                 /* draw lines */
-                gfx_new_dashed_line(im->canvas,
-                                    X0 - 1, Y0,
-                                    X1 + 1, Y0,
-                                    GRIDWIDTH, im->graph_col[GRC_GRID],
-                                    im->grid_dash_on, im->grid_dash_off);
+                gfx_line(im->cr,
+                         X0 - 2, Y0,
+                         X0, Y0, GRIDWIDTH, im->graph_col[GRC_GRID]);
+                gfx_line(im->cr,
+                         X1, Y0,
+                         X1 + 2, Y0, GRIDWIDTH, im->graph_col[GRC_GRID]);
+                gfx_dashed_line(im->cr,
+                                X0 - 1, Y0,
+                                X1 + 1, Y0,
+                                GRIDWIDTH, im->graph_col[GRC_GRID],
+                                im->grid_dash_on, im->grid_dash_off);
             }
         }
 
             }
         }
 
@@ -2178,11 +2208,15 @@ int horizontal_log_grid(
                 break;
 
             /* draw lines */
                 break;
 
             /* draw lines */
-            gfx_new_dashed_line(im->canvas,
-                                X0 - 1, Y0,
-                                X1 + 1, Y0,
-                                GRIDWIDTH, im->graph_col[GRC_GRID],
-                                im->grid_dash_on, im->grid_dash_off);
+            gfx_line(im->cr,
+                     X0 - 2, Y0, X0, Y0, GRIDWIDTH, im->graph_col[GRC_GRID]);
+            gfx_line(im->cr,
+                     X1, Y0, X1 + 2, Y0, GRIDWIDTH, im->graph_col[GRC_GRID]);
+            gfx_dashed_line(im->cr,
+                            X0 - 1, Y0,
+                            X1 + 1, Y0,
+                            GRIDWIDTH, im->graph_col[GRC_GRID],
+                            im->grid_dash_on, im->grid_dash_off);
         }
     }
     /* fancy minor gridlines */
         }
     }
     /* fancy minor gridlines */
@@ -2197,11 +2231,15 @@ int horizontal_log_grid(
                 break;
 
             /* draw lines */
                 break;
 
             /* draw lines */
-            gfx_new_dashed_line(im->canvas,
-                                X0 - 1, Y0,
-                                X1 + 1, Y0,
-                                GRIDWIDTH, im->graph_col[GRC_GRID],
-                                im->grid_dash_on, im->grid_dash_off);
+            gfx_line(im->cr,
+                     X0 - 2, Y0, X0, Y0, GRIDWIDTH, im->graph_col[GRC_GRID]);
+            gfx_line(im->cr,
+                     X1, Y0, X1 + 2, Y0, GRIDWIDTH, im->graph_col[GRC_GRID]);
+            gfx_dashed_line(im->cr,
+                            X0 - 1, Y0,
+                            X1 + 1, Y0,
+                            GRIDWIDTH, im->graph_col[GRC_GRID],
+                            im->grid_dash_on, im->grid_dash_off);
         }
     }
 
         }
     }
 
@@ -2272,9 +2310,13 @@ void vertical_grid(
             if (ti == timajor)
                 continue;   /* skip as falls on major grid line */
             X0 = xtr(im, ti);
             if (ti == timajor)
                 continue;   /* skip as falls on major grid line */
             X0 = xtr(im, ti);
-            gfx_new_dashed_line(im->canvas, X0, Y0 + 1, X0, Y1 - 1, GRIDWIDTH,
-                                im->graph_col[GRC_GRID],
-                                im->grid_dash_on, im->grid_dash_off);
+            gfx_line(im->cr, X0, Y1 - 2, X0, Y1, GRIDWIDTH,
+                     im->graph_col[GRC_GRID]);
+            gfx_line(im->cr, X0, Y0, X0, Y0 + 2, GRIDWIDTH,
+                     im->graph_col[GRC_GRID]);
+            gfx_dashed_line(im->cr, X0, Y1 - 1, X0, Y0 + 1, GRIDWIDTH,
+                            im->graph_col[GRC_GRID],
+                            im->grid_dash_on, im->grid_dash_off);
 
         }
     }
 
         }
     }
@@ -2290,9 +2332,13 @@ void vertical_grid(
         if (ti < im->start || ti > im->end)
             continue;
         X0 = xtr(im, ti);
         if (ti < im->start || ti > im->end)
             continue;
         X0 = xtr(im, ti);
-        gfx_new_dashed_line(im->canvas, X0, Y0 + 3, X0, Y1 - 2, MGRIDWIDTH,
-                            im->graph_col[GRC_MGRID],
-                            im->grid_dash_on, im->grid_dash_off);
+        gfx_line(im->cr, X0, Y1 - 2, X0, Y1, MGRIDWIDTH,
+                 im->graph_col[GRC_MGRID]);
+        gfx_line(im->cr, X0, Y0, X0, Y0 + 3, MGRIDWIDTH,
+                 im->graph_col[GRC_MGRID]);
+        gfx_dashed_line(im->cr, X0, Y1 - 2, X0, Y0 + 3, MGRIDWIDTH,
+                        im->graph_col[GRC_MGRID],
+                        im->grid_dash_on, im->grid_dash_off);
 
     }
     /* paint the labels below the graph */
 
     }
     /* paint the labels below the graph */
@@ -2313,13 +2359,13 @@ void vertical_grid(
 #else
 # error "your libc has no strftime I guess we'll abort the exercise here."
 #endif
 #else
 # error "your libc has no strftime I guess we'll abort the exercise here."
 #endif
-        gfx_new_text(im->canvas,
-                     xtr(im, tilab),
-                     Y0 + im->text_prop[TEXT_PROP_AXIS].size * 1.4 + 5,
-                     im->graph_col[GRC_FONT],
-                     im->text_prop[TEXT_PROP_AXIS].font,
-                     im->text_prop[TEXT_PROP_AXIS].size, im->tabwidth, 0.0,
-                     GFX_H_CENTER, GFX_V_BOTTOM, graph_label);
+        gfx_text(im->cr,
+                 xtr(im, tilab),
+                 Y0 + 1,
+                 im->graph_col[GRC_FONT],
+                 im->text_prop[TEXT_PROP_AXIS].font,
+                 im->text_prop[TEXT_PROP_AXIS].size, im->tabwidth, 0.0,
+                 GFX_H_CENTER, GFX_V_TOP, graph_label);
 
     }
 
 
     }
 
@@ -2330,29 +2376,32 @@ void axis_paint(
     image_desc_t *im)
 {
     /* draw x and y axis */
     image_desc_t *im)
 {
     /* draw x and y axis */
-    /* gfx_new_line ( im->canvas, im->xorigin+im->xsize,im->yorigin,
+    /* gfx_line ( im->canvas, im->xorigin+im->xsize,im->yorigin,
        im->xorigin+im->xsize,im->yorigin-im->ysize,
        GRIDWIDTH, im->graph_col[GRC_AXIS]);
 
        im->xorigin+im->xsize,im->yorigin-im->ysize,
        GRIDWIDTH, im->graph_col[GRC_AXIS]);
 
-       gfx_new_line ( im->canvas, im->xorigin,im->yorigin-im->ysize,
+       gfx_line ( im->canvas, im->xorigin,im->yorigin-im->ysize,
        im->xorigin+im->xsize,im->yorigin-im->ysize,
        GRIDWIDTH, im->graph_col[GRC_AXIS]); */
 
        im->xorigin+im->xsize,im->yorigin-im->ysize,
        GRIDWIDTH, im->graph_col[GRC_AXIS]); */
 
-    gfx_new_line(im->canvas, im->xorigin - 4, im->yorigin,
-                 im->xorigin + im->xsize + 4, im->yorigin,
-                 MGRIDWIDTH, im->graph_col[GRC_AXIS]);
+    gfx_line(im->cr, im->xorigin - 4, im->yorigin,
+             im->xorigin + im->xsize + 4, im->yorigin,
+             MGRIDWIDTH, im->graph_col[GRC_AXIS]);
 
 
-    gfx_new_line(im->canvas, im->xorigin, im->yorigin + 4,
-                 im->xorigin, im->yorigin - im->ysize - 4,
-                 MGRIDWIDTH, im->graph_col[GRC_AXIS]);
+    gfx_line(im->cr, im->xorigin, im->yorigin + 4,
+             im->xorigin, im->yorigin - im->ysize - 4,
+             MGRIDWIDTH, im->graph_col[GRC_AXIS]);
 
 
     /* arrow for X and Y axis direction */
 
 
     /* arrow for X and Y axis direction */
-    gfx_new_area(im->canvas, im->xorigin + im->xsize + 2, im->yorigin - 2, im->xorigin + im->xsize + 2, im->yorigin + 3, im->xorigin + im->xsize + 7, im->yorigin + 0.5,    /* LINEOFFSET */
+    gfx_new_area(im->cr, im->xorigin + im->xsize + 2, im->yorigin - 2, im->xorigin + im->xsize + 2, im->yorigin + 3, im->xorigin + im->xsize + 7, im->yorigin + 0.5,    /* LINEOFFSET */
                  im->graph_col[GRC_ARROW]);
                  im->graph_col[GRC_ARROW]);
+    gfx_close_path(im->cr);
 
 
-    gfx_new_area(im->canvas, im->xorigin - 2, im->yorigin - im->ysize - 2, im->xorigin + 3, im->yorigin - im->ysize - 2, im->xorigin + 0.5, im->yorigin - im->ysize - 7,    /* LINEOFFSET */
+    gfx_new_area(im->cr, im->xorigin - 2, im->yorigin - im->ysize - 2, im->xorigin + 3, im->yorigin - im->ysize - 2, im->xorigin + 0.5, im->yorigin - im->ysize - 7,    /* LINEOFFSET */
                  im->graph_col[GRC_ARROW]);
                  im->graph_col[GRC_ARROW]);
+    gfx_close_path(im->cr);
+
 
 }
 
 
 }
 
@@ -2362,23 +2411,23 @@ void grid_paint(
     long      i;
     int       res = 0;
     double    X0, Y0;   /* points for filled graph and more */
     long      i;
     int       res = 0;
     double    X0, Y0;   /* points for filled graph and more */
-    gfx_node_t *node;
+    struct gfx_color_t water_color;
 
     /* draw 3d border */
 
     /* draw 3d border */
-    node = gfx_new_area(im->canvas, 0, im->yimg,
-                        2, im->yimg - 2, 2, 2, im->graph_col[GRC_SHADEA]);
-    gfx_add_point(node, im->ximg - 2, 2);
-    gfx_add_point(node, im->ximg, 0);
-    gfx_add_point(node, 0, 0);
-/*    gfx_add_point( node , 0,im->yimg ); */
-
-    node = gfx_new_area(im->canvas, 2, im->yimg - 2,
-                        im->ximg - 2, im->yimg - 2,
-                        im->ximg - 2, 2, im->graph_col[GRC_SHADEB]);
-    gfx_add_point(node, im->ximg, 0);
-    gfx_add_point(node, im->ximg, im->yimg);
-    gfx_add_point(node, 0, im->yimg);
-/*    gfx_add_point( node , 0,im->yimg ); */
+    gfx_new_area(im->cr, 0, im->yimg,
+                 2, im->yimg - 2, 2, 2, im->graph_col[GRC_SHADEA]);
+    gfx_add_point(im->cr, im->ximg - 2, 2);
+    gfx_add_point(im->cr, im->ximg, 0);
+    gfx_add_point(im->cr, 0, 0);
+    gfx_close_path(im->cr);
+
+    gfx_new_area(im->cr, 2, im->yimg - 2,
+                 im->ximg - 2, im->yimg - 2,
+                 im->ximg - 2, 2, im->graph_col[GRC_SHADEB]);
+    gfx_add_point(im->cr, im->ximg, 0);
+    gfx_add_point(im->cr, im->ximg, im->yimg);
+    gfx_add_point(im->cr, 0, im->yimg);
+    gfx_close_path(im->cr);
 
 
     if (im->draw_x_grid == 1)
 
 
     if (im->draw_x_grid == 1)
@@ -2395,47 +2444,48 @@ void grid_paint(
         if (!res) {
             char     *nodata = "No Data found";
 
         if (!res) {
             char     *nodata = "No Data found";
 
-            gfx_new_text(im->canvas, im->ximg / 2,
-                         (2 * im->yorigin - im->ysize) / 2,
-                         im->graph_col[GRC_FONT],
-                         im->text_prop[TEXT_PROP_AXIS].font,
-                         im->text_prop[TEXT_PROP_AXIS].size, im->tabwidth,
-                         0.0, GFX_H_CENTER, GFX_V_CENTER, nodata);
+            gfx_text(im->cr, im->ximg / 2,
+                     (2 * im->yorigin - im->ysize) / 2,
+                     im->graph_col[GRC_FONT],
+                     im->text_prop[TEXT_PROP_AXIS].font,
+                     im->text_prop[TEXT_PROP_AXIS].size, im->tabwidth,
+                     0.0, GFX_H_CENTER, GFX_V_CENTER, nodata);
         }
     }
 
     /* yaxis unit description */
         }
     }
 
     /* yaxis unit description */
-    gfx_new_text(im->canvas,
-                 10, (im->yorigin - im->ysize / 2),
-                 im->graph_col[GRC_FONT],
-                 im->text_prop[TEXT_PROP_UNIT].font,
-                 im->text_prop[TEXT_PROP_UNIT].size, im->tabwidth,
-                 RRDGRAPH_YLEGEND_ANGLE,
-                 GFX_H_LEFT, GFX_V_CENTER, im->ylegend);
+    gfx_text(im->cr,
+             10, (im->yorigin - im->ysize / 2),
+             im->graph_col[GRC_FONT],
+             im->text_prop[TEXT_PROP_UNIT].font,
+             im->text_prop[TEXT_PROP_UNIT].size, im->tabwidth,
+             RRDGRAPH_YLEGEND_ANGLE, GFX_H_CENTER, GFX_V_CENTER, im->ylegend);
 
     /* graph title */
 
     /* graph title */
-    gfx_new_text(im->canvas,
-                 im->ximg / 2, im->text_prop[TEXT_PROP_TITLE].size * 1.3 + 4,
-                 im->graph_col[GRC_FONT],
-                 im->text_prop[TEXT_PROP_TITLE].font,
-                 im->text_prop[TEXT_PROP_TITLE].size, im->tabwidth, 0.0,
-                 GFX_H_CENTER, GFX_V_CENTER, im->title);
+    gfx_text(im->cr,
+             im->ximg / 2, 4,
+             im->graph_col[GRC_FONT],
+             im->text_prop[TEXT_PROP_TITLE].font,
+             im->text_prop[TEXT_PROP_TITLE].size, im->tabwidth, 0.0,
+             GFX_H_CENTER, GFX_V_TOP, im->title);
     /* rrdtool 'logo' */
     /* rrdtool 'logo' */
-    gfx_new_text(im->canvas,
-                 im->ximg - 7, 7,
-                 (im->graph_col[GRC_FONT] & 0xffffff00) | 0x00000044,
-                 im->text_prop[TEXT_PROP_AXIS].font,
-                 5.5, im->tabwidth, 270,
-                 GFX_H_RIGHT, GFX_V_TOP, "RRDTOOL / TOBI OETIKER");
+    water_color = im->graph_col[GRC_FONT];
+    water_color.alpha = 0.3;
+    gfx_text(im->cr,
+             im->ximg - 4, 7,
+             water_color,
+             im->text_prop[TEXT_PROP_AXIS].font,
+             5.5, im->tabwidth, -90,
+             GFX_H_LEFT, GFX_V_TOP, "RRDTOOL / TOBI OETIKER");
 
     /* graph watermark */
     if (im->watermark[0] != '\0') {
 
     /* graph watermark */
     if (im->watermark[0] != '\0') {
-        gfx_new_text(im->canvas,
-                     im->ximg / 2, im->yimg - 6,
-                     (im->graph_col[GRC_FONT] & 0xffffff00) | 0x00000044,
-                     im->text_prop[TEXT_PROP_AXIS].font,
-                     5.5, im->tabwidth, 0,
-                     GFX_H_CENTER, GFX_V_BOTTOM, im->watermark);
+        gfx_text(im->cr,
+                 im->ximg / 2, im->yimg - 6,
+                 water_color,
+                 im->text_prop[TEXT_PROP_AXIS].font,
+                 5.5, im->tabwidth, 0,
+                 GFX_H_CENTER, GFX_V_BOTTOM, im->watermark);
     }
 
     /* graph labels */
     }
 
     /* graph labels */
@@ -2447,42 +2497,54 @@ void grid_paint(
             /* im->gdes[i].leg_y is the bottom of the legend */
             X0 = im->gdes[i].leg_x;
             Y0 = im->gdes[i].leg_y;
             /* im->gdes[i].leg_y is the bottom of the legend */
             X0 = im->gdes[i].leg_x;
             Y0 = im->gdes[i].leg_y;
-            gfx_new_text(im->canvas, X0, Y0,
-                         im->graph_col[GRC_FONT],
-                         im->text_prop[TEXT_PROP_LEGEND].font,
-                         im->text_prop[TEXT_PROP_LEGEND].size,
-                         im->tabwidth, 0.0, GFX_H_LEFT, GFX_V_BOTTOM,
-                         im->gdes[i].legend);
+            gfx_text(im->cr, X0, Y0,
+                     im->graph_col[GRC_FONT],
+                     im->text_prop[TEXT_PROP_LEGEND].font,
+                     im->text_prop[TEXT_PROP_LEGEND].size,
+                     im->tabwidth, 0.0, GFX_H_LEFT, GFX_V_BOTTOM,
+                     im->gdes[i].legend);
             /* The legend for GRAPH items starts with "M " to have
                enough space for the box */
             if (im->gdes[i].gf != GF_PRINT &&
                 im->gdes[i].gf != GF_GPRINT && im->gdes[i].gf != GF_COMMENT) {
                 int       boxH, boxV;
 
             /* The legend for GRAPH items starts with "M " to have
                enough space for the box */
             if (im->gdes[i].gf != GF_PRINT &&
                 im->gdes[i].gf != GF_GPRINT && im->gdes[i].gf != GF_COMMENT) {
                 int       boxH, boxV;
 
-                boxH = gfx_get_text_width(im->canvas, 0,
+                boxH = gfx_get_text_width(im->cr, 0,
                                           im->text_prop[TEXT_PROP_LEGEND].
                                           font,
                                           im->text_prop[TEXT_PROP_LEGEND].
                                           im->text_prop[TEXT_PROP_LEGEND].
                                           font,
                                           im->text_prop[TEXT_PROP_LEGEND].
-                                          size, im->tabwidth, "o", 0) * 1.2;
+                                          size, im->tabwidth, "o") * 1.2;
                 boxV = boxH * 1.1;
 
                 boxV = boxH * 1.1;
 
+                /* shift the box up a bit */
+                Y0 -= boxV * 0.3;
+
                 /* make sure transparent colors show up the same way as in the graph */
                 /* make sure transparent colors show up the same way as in the graph */
-                node = gfx_new_area(im->canvas,
-                                    X0, Y0 - boxV,
-                                    X0, Y0,
-                                    X0 + boxH, Y0, im->graph_col[GRC_BACK]);
-                gfx_add_point(node, X0 + boxH, Y0 - boxV);
-
-                node = gfx_new_area(im->canvas,
-                                    X0, Y0 - boxV,
-                                    X0, Y0, X0 + boxH, Y0, im->gdes[i].col);
-                gfx_add_point(node, X0 + boxH, Y0 - boxV);
-                node = gfx_new_line(im->canvas,
-                                    X0, Y0 - boxV,
-                                    X0, Y0, 1.0, im->graph_col[GRC_FRAME]);
-                gfx_add_point(node, X0 + boxH, Y0);
-                gfx_add_point(node, X0 + boxH, Y0 - boxV);
-                gfx_close_path(node);
+
+                gfx_new_area(im->cr,
+                             X0, Y0 - boxV,
+                             X0, Y0, X0 + boxH, Y0, im->graph_col[GRC_BACK]);
+                gfx_add_point(im->cr, X0 + boxH, Y0 - boxV);
+                gfx_close_path(im->cr);
+
+                gfx_new_area(im->cr,
+                             X0, Y0 - boxV,
+                             X0, Y0, X0 + boxH, Y0, im->gdes[i].col);
+                gfx_add_point(im->cr, X0 + boxH, Y0 - boxV);
+                gfx_close_path(im->cr);
+
+                gfx_line(im->cr,
+                         X0, Y0 - boxV,
+                         X0, Y0, 1.0, im->graph_col[GRC_FRAME]);
+                gfx_line(im->cr,
+                         X0, Y0,
+                         X0 + boxH, Y0, 1.0, im->graph_col[GRC_FRAME]);
+                gfx_line(im->cr,
+                         X0 + boxH, Y0,
+                         X0 + boxH, Y0 - boxV, 1.0, im->graph_col[GRC_FRAME]);
+                gfx_line(im->cr,
+                         X0 + boxH, Y0 - boxV,
+                         X0, Y0 - boxV, 1.0, im->graph_col[GRC_FRAME]);
             }
         }
     }
             }
         }
     }
@@ -2510,7 +2572,7 @@ int lazy_check(
         return 0;
     if ((fd = fopen(im->graphfile, "rb")) == NULL)
         return 0;       /* the file does not exist */
         return 0;
     if ((fd = fopen(im->graphfile, "rb")) == NULL)
         return 0;       /* the file does not exist */
-    switch (im->canvas->imgformat) {
+    switch (im->imgformat) {
     case IF_PNG:
         size = PngSize(fd, &(im->ximg), &(im->yimg));
         break;
     case IF_PNG:
         size = PngSize(fd, &(im->ximg), &(im->yimg));
         break;
@@ -2521,67 +2583,10 @@ int lazy_check(
     return size;
 }
 
     return size;
 }
 
-#ifdef WITH_PIECHART
-void pie_part(
-    image_desc_t *im,
-    gfx_color_t color,
-    double PieCenterX,
-    double PieCenterY,
-    double Radius,
-    double startangle,
-    double endangle)
-{
-    gfx_node_t *node;
-    double    angle;
-    double    step = M_PI / 50; /* Number of iterations for the circle;
-                                 ** 10 is definitely too low, more than
-                                 ** 50 seems to be overkill
-                                 */
-
-    /* Strange but true: we have to work clockwise or else
-     ** anti aliasing nor transparency don't work.
-     **
-     ** This test is here to make sure we do it right, also
-     ** this makes the for...next loop more easy to implement.
-     ** The return will occur if the user enters a negative number
-     ** (which shouldn't be done according to the specs) or if the
-     ** programmers do something wrong (which, as we all know, never
-     ** happens anyway :)
-     */
-    if (endangle < startangle)
-        return;
-
-    /* Hidden feature: Radius decreases each full circle */
-    angle = startangle;
-    while (angle >= 2 * M_PI) {
-        angle -= 2 * M_PI;
-        Radius *= 0.8;
-    }
-
-    node = gfx_new_area(im->canvas,
-                        PieCenterX + sin(startangle) * Radius,
-                        PieCenterY - cos(startangle) * Radius,
-                        PieCenterX,
-                        PieCenterY,
-                        PieCenterX + sin(endangle) * Radius,
-                        PieCenterY - cos(endangle) * Radius, color);
-    for (angle = endangle; angle - startangle >= step; angle -= step) {
-        gfx_add_point(node,
-                      PieCenterX + sin(angle) * Radius,
-                      PieCenterY - cos(angle) * Radius);
-    }
-}
-
-#endif
 
 int graph_size_location(
     image_desc_t *im,
 
 int graph_size_location(
     image_desc_t *im,
-    int elements
-#ifdef WITH_PIECHART
-    ,
-    int piechart
-#endif
-    )
+    int elements)
 {
     /* The actual size of the image to draw is determined from
      ** several sources.  The size given on the command line is
 {
     /* The actual size of the image to draw is determined from
      ** several sources.  The size given on the command line is
@@ -2590,14 +2595,7 @@ int graph_size_location(
      */
 
     int       Xvertical = 0, Ytitle = 0, Xylabel = 0, Xmain = 0, Ymain = 0,
      */
 
     int       Xvertical = 0, Ytitle = 0, Xylabel = 0, Xmain = 0, Ymain = 0,
-#ifdef WITH_PIECHART
-        Xpie = 0, Ypie = 0,
-#endif
-        Yxlabel = 0,
-#if 0
-        Xlegend = 0, Ylegend = 0,
-#endif
-        Xspacing = 15, Yspacing = 15, Ywatermark = 4;
+        Yxlabel = 0, Xspacing = 15, Yspacing = 15, Ywatermark = 4;
 
     if (im->extra_flags & ONLY_GRAPH) {
         im->xorigin = 0;
 
     if (im->extra_flags & ONLY_GRAPH) {
         im->xorigin = 0;
@@ -2646,11 +2644,10 @@ int graph_size_location(
             Yxlabel = im->text_prop[TEXT_PROP_AXIS].size * 2.5;
         }
         if (im->draw_y_grid || im->forceleftspace) {
             Yxlabel = im->text_prop[TEXT_PROP_AXIS].size * 2.5;
         }
         if (im->draw_y_grid || im->forceleftspace) {
-            Xylabel = gfx_get_text_width(im->canvas, 0,
+            Xylabel = gfx_get_text_width(im->cr, 0,
                                          im->text_prop[TEXT_PROP_AXIS].font,
                                          im->text_prop[TEXT_PROP_AXIS].size,
                                          im->text_prop[TEXT_PROP_AXIS].font,
                                          im->text_prop[TEXT_PROP_AXIS].size,
-                                         im->tabwidth,
-                                         "0", 0) * im->unitslength;
+                                         im->tabwidth, "0") * im->unitslength;
         }
     }
 
         }
     }
 
@@ -2668,14 +2665,6 @@ int graph_size_location(
 
         im->yorigin += Ytitle;
 
 
         im->yorigin += Ytitle;
 
-#ifdef WITH_PIECHART
-        if (piechart) {
-            im->piesize = im->xsize < im->ysize ? im->xsize : im->ysize;
-            Xpie = im->piesize;
-            Ypie = im->piesize;
-        }
-#endif
-
         /* Now calculate the total size.  Insert some spacing where
            desired.  im->xorigin and im->yorigin need to correspond
            with the lower left corner of the main graph area or, if
         /* Now calculate the total size.  Insert some spacing where
            desired.  im->xorigin and im->yorigin need to correspond
            with the lower left corner of the main graph area or, if
@@ -2687,12 +2676,6 @@ int graph_size_location(
         if (Xmain)
             Xmain -= Xspacing;  /* put space between main graph area and right edge */
 
         if (Xmain)
             Xmain -= Xspacing;  /* put space between main graph area and right edge */
 
-#ifdef WITH_PIECHART
-        Xmain -= Xpie;  /* remove pie width from main graph area */
-        if (Xpie)
-            Xmain -= Xspacing;  /* put space between pie and main graph area */
-#endif
-
         im->xorigin = Xspacing + Xylabel;
 
         /* the length of the title should not influence with width of the graph
         im->xorigin = Xspacing + Xylabel;
 
         /* the length of the title should not influence with width of the graph
@@ -2710,23 +2693,20 @@ int graph_size_location(
          ** of the legend and the axis labels.
          */
 
          ** of the legend and the axis labels.
          */
 
-        if (im->extra_flags & NOLEGEND)
-        {
+        if (im->extra_flags & NOLEGEND) {
             /* set dimensions correctly if using full size mode with no legend */
             /* set dimensions correctly if using full size mode with no legend */
-            im->yorigin = im->yimg - im->text_prop[TEXT_PROP_AXIS].size * 2.5 - Yspacing;
+            im->yorigin =
+                im->yimg - im->text_prop[TEXT_PROP_AXIS].size * 2.5 -
+                Yspacing;
             Ymain = im->yorigin;
             Ymain = im->yorigin;
-        } else
-        {
+        } else {
             /* Determine where to place the legends onto the image.
             /* Determine where to place the legends onto the image.
-            ** Set Ymain and adjust im->yorigin to match the space requirements.
-            */
+             ** Set Ymain and adjust im->yorigin to match the space requirements.
+             */
             if (leg_place(im, &Ymain) == -1)
             if (leg_place(im, &Ymain) == -1)
-               return -1;
+                return -1;
         }
 
         }
 
-#ifdef WITH_PIECHART
-        /* if (im->yimg < Ypie) im->yimg = Ypie; * not sure what do about this */
-#endif
 
         /* remove title space *or* some padding above the graph from the main graph area */
         if (Ytitle) {
 
         /* remove title space *or* some padding above the graph from the main graph area */
         if (Ytitle) {
@@ -2773,14 +2753,6 @@ int graph_size_location(
             Xmain = im->xsize;
             Ymain = im->ysize;
         }
             Xmain = im->xsize;
             Ymain = im->ysize;
         }
-#ifdef WITH_PIECHART
-        if (piechart) {
-            im->piesize = im->xsize < im->ysize ? im->xsize : im->ysize;
-            Xpie = im->piesize;
-            Ypie = im->piesize;
-        }
-#endif
-
         /* Now calculate the total size.  Insert some spacing where
            desired.  im->xorigin and im->yorigin need to correspond
            with the lower left corner of the main graph area or, if
         /* Now calculate the total size.  Insert some spacing where
            desired.  im->xorigin and im->yorigin need to correspond
            with the lower left corner of the main graph area or, if
@@ -2794,16 +2766,8 @@ int graph_size_location(
          */
         im->ximg = Xylabel + Xmain + 2 * Xspacing;
 
          */
         im->ximg = Xylabel + Xmain + 2 * Xspacing;
 
-#ifdef WITH_PIECHART
-        im->ximg += Xpie;
-#endif
-
         if (Xmain)
             im->ximg += Xspacing;
         if (Xmain)
             im->ximg += Xspacing;
-#ifdef WITH_PIECHART
-        if (Xpie)
-            im->ximg += Xspacing;
-#endif
 
         im->xorigin = Xspacing + Xylabel;
 
 
         im->xorigin = Xspacing + Xylabel;
 
@@ -2830,10 +2794,6 @@ int graph_size_location(
 
         im->yimg = Ymain + Yxlabel;
 
 
         im->yimg = Ymain + Yxlabel;
 
-#ifdef WITH_PIECHART
-        if (im->yimg < Ypie)
-            im->yimg = Ypie;
-#endif
 
         im->yorigin = im->yimg - Yxlabel;
 
 
         im->yorigin = im->yimg - Yxlabel;
 
@@ -2859,27 +2819,6 @@ int graph_size_location(
         }
     }
 
         }
     }
 
-#if 0
-    if (Xlegend > im->ximg) {
-        im->ximg = Xlegend;
-        /* reposition Pie */
-    }
-#endif
-
-#ifdef WITH_PIECHART
-    /* The pie is placed in the upper right hand corner,
-     ** just below the title (if any) and with sufficient
-     ** padding.
-     */
-    if (elements) {
-        im->pie_x = im->ximg - Xspacing - Xpie / 2;
-        im->pie_y = im->yorigin - Ymain + Ypie / 2;
-    } else {
-        im->pie_x = im->ximg / 2;
-        im->pie_y = im->yorigin - Ypie / 2;
-    }
-#endif
-
     ytr(im, DNAN);
     return 0;
 }
     ytr(im, DNAN);
     return 0;
 }
@@ -2897,14 +2836,9 @@ int graph_paint(
     int       i, ii;
     int       lazy = lazy_check(im);
 
     int       i, ii;
     int       lazy = lazy_check(im);
 
-#ifdef WITH_PIECHART
-    int       piechart = 0;
-    double    PieStart = 0.0;
-#endif
-    FILE     *fo;
-    gfx_node_t *node;
-
     double    areazero = 0.0;
     double    areazero = 0.0;
+    PangoFontMap *font_map = pango_cairo_font_map_get_default();
+
     graph_desc_t *lastgdes = NULL;
 
     /* if we are lazy and there is nothing to PRINT ... quit now */
     graph_desc_t *lastgdes = NULL;
 
     /* if we are lazy and there is nothing to PRINT ... quit now */
@@ -2920,15 +2854,6 @@ int graph_paint(
     if (data_calc(im) == -1)
         return -1;
 
     if (data_calc(im) == -1)
         return -1;
 
-#ifdef WITH_PIECHART
-    /* check if we need to draw a piechart */
-    for (i = 0; i < im->gdes_c; i++) {
-        if (im->gdes[i].gf == GF_PART) {
-            piechart = 1;
-            break;
-        }
-    }
-#endif
 
     /* calculate and PRINT and GPRINT definitions. We have to do it at
      * this point because it will affect the length of the legends
 
     /* calculate and PRINT and GPRINT definitions. We have to do it at
      * this point because it will affect the length of the legends
@@ -2938,28 +2863,14 @@ int graph_paint(
     i = print_calc(im, calcpr);
     if (i < 0)
         return -1;
     i = print_calc(im, calcpr);
     if (i < 0)
         return -1;
-    if (((i == 0)
-#ifdef WITH_PIECHART
-         && (piechart == 0)
-#endif
-        ) || lazy)
+    if ((i == 0) || lazy)
         return 0;
 
         return 0;
 
-#ifdef WITH_PIECHART
-    /* If there's only the pie chart to draw, signal this */
-    if (i == 0)
-        piechart = 2;
-#endif
-
 /**************************************************************
  *** Calculating sizes and locations became a bit confusing ***
  *** so I moved this into a separate function.              ***
  **************************************************************/
 /**************************************************************
  *** Calculating sizes and locations became a bit confusing ***
  *** so I moved this into a separate function.              ***
  **************************************************************/
-    if (graph_size_location(im, i
-#ifdef WITH_PIECHART
-                            , piechart
-#endif
-        ) == -1)
+    if (graph_size_location(im, i) == -1)
         return -1;
 
     /* get actual drawing data and find min and max values */
         return -1;
 
     /* get actual drawing data and find min and max values */
@@ -2982,39 +2893,57 @@ int graph_paint(
 
     /* the actual graph is created by going through the individual
        graph elements and then drawing them */
 
     /* the actual graph is created by going through the individual
        graph elements and then drawing them */
+    cairo_surface_destroy(im->surface);
 
 
-    node = gfx_new_area(im->canvas,
-                        0, 0,
-                        0, im->yimg,
-                        im->ximg, im->yimg, im->graph_col[GRC_BACK]);
+    switch (im->imgformat) {
+    case IF_PNG:
+        im->surface =
+            cairo_image_surface_create(CAIRO_FORMAT_ARGB32,
+                                       im->ximg * im->zoom,
+                                       im->yimg * im->zoom);
+        break;
+    case IF_PDF:
+        im->surface =
+            cairo_pdf_surface_create(im->graphfile, im->ximg * im->zoom,
+                                     im->yimg * im->zoom);
+        break;
+    case IF_EPS:
+        im->surface =
+            cairo_ps_surface_create(im->graphfile, im->ximg * im->zoom,
+                                    im->yimg * im->zoom);
+        break;
+    case IF_SVG:
+        im->surface =
+            cairo_svg_surface_create(im->graphfile, im->ximg * im->zoom,
+                                     im->yimg * im->zoom);
+        cairo_svg_surface_restrict_to_version(im->surface,
+                                              CAIRO_SVG_VERSION_1_1);
+        break;
+    };
+    im->cr = cairo_create(im->surface);
+    pango_cairo_font_map_set_resolution(font_map, 100);
+    cairo_scale(im->cr, im->zoom, im->zoom);
 
 
-    gfx_add_point(node, im->ximg, 0);
+    gfx_new_area(im->cr,
+                 0, 0,
+                 0, im->yimg, im->ximg, im->yimg, im->graph_col[GRC_BACK]);
 
 
-#ifdef WITH_PIECHART
-    if (piechart != 2) {
-#endif
-        node = gfx_new_area(im->canvas,
-                            im->xorigin, im->yorigin,
-                            im->xorigin + im->xsize, im->yorigin,
-                            im->xorigin + im->xsize, im->yorigin - im->ysize,
-                            im->graph_col[GRC_CANVAS]);
-
-        gfx_add_point(node, im->xorigin, im->yorigin - im->ysize);
-
-        if (im->minval > 0.0)
-            areazero = im->minval;
-        if (im->maxval < 0.0)
-            areazero = im->maxval;
-#ifdef WITH_PIECHART
-    }
-#endif
+    gfx_add_point(im->cr, im->ximg, 0);
+    gfx_close_path(im->cr);
 
 
-#ifdef WITH_PIECHART
-    if (piechart) {
-        pie_part(im, im->graph_col[GRC_CANVAS], im->pie_x, im->pie_y,
-                 im->piesize * 0.5, 0, 2 * M_PI);
-    }
-#endif
+    gfx_new_area(im->cr,
+                 im->xorigin, im->yorigin,
+                 im->xorigin + im->xsize, im->yorigin,
+                 im->xorigin + im->xsize, im->yorigin - im->ysize,
+                 im->graph_col[GRC_CANVAS]);
+
+    gfx_add_point(im->cr, im->xorigin, im->yorigin - im->ysize);
+    gfx_close_path(im->cr);
+
+    if (im->minval > 0.0)
+        areazero = im->minval;
+    if (im->maxval < 0.0)
+        areazero = im->maxval;
 
     for (i = 0; i < im->gdes_c; i++) {
         switch (im->gdes[i].gf) {
 
     for (i = 0; i < im->gdes_c; i++) {
         switch (im->gdes[i].gf) {
@@ -3034,20 +2963,20 @@ int graph_paint(
                 if (!isnan(im->gdes[i].p_data[ii]) &&
                     im->gdes[i].p_data[ii] != 0.0) {
                     if (im->gdes[i].yrule > 0) {
                 if (!isnan(im->gdes[i].p_data[ii]) &&
                     im->gdes[i].p_data[ii] != 0.0) {
                     if (im->gdes[i].yrule > 0) {
-                        gfx_new_line(im->canvas,
-                                     im->xorigin + ii, im->yorigin,
-                                     im->xorigin + ii,
-                                     im->yorigin -
-                                     im->gdes[i].yrule * im->ysize, 1.0,
-                                     im->gdes[i].col);
+                        gfx_line(im->cr,
+                                 im->xorigin + ii, im->yorigin,
+                                 im->xorigin + ii,
+                                 im->yorigin -
+                                 im->gdes[i].yrule * im->ysize, 1.0,
+                                 im->gdes[i].col);
                     } else if (im->gdes[i].yrule < 0) {
                     } else if (im->gdes[i].yrule < 0) {
-                        gfx_new_line(im->canvas,
-                                     im->xorigin + ii,
-                                     im->yorigin - im->ysize,
-                                     im->xorigin + ii,
-                                     im->yorigin - (1 -
-                                                    im->gdes[i].yrule) *
-                                     im->ysize, 1.0, im->gdes[i].col);
+                        gfx_line(im->cr,
+                                 im->xorigin + ii,
+                                 im->yorigin - im->ysize,
+                                 im->xorigin + ii,
+                                 im->yorigin - (1 -
+                                                im->gdes[i].yrule) *
+                                 im->ysize, 1.0, im->gdes[i].col);
 
                     }
                 }
 
                     }
                 }
@@ -3078,52 +3007,74 @@ int graph_paint(
                we draw a square from t-1 to t with the value a.
 
                ********************************************************* */
                we draw a square from t-1 to t with the value a.
 
                ********************************************************* */
-            if (im->gdes[i].col != 0x0) {
+            if (im->gdes[i].col.alpha != 0.0) {
                 /* GF_LINE and friend */
                 if (im->gdes[i].gf == GF_LINE) {
                     double    last_y = 0.0;
                 /* GF_LINE and friend */
                 if (im->gdes[i].gf == GF_LINE) {
                     double    last_y = 0.0;
+                    int       draw_on = 0;
 
 
-                    node = NULL;
+                    cairo_save(im->cr);
+                    cairo_new_path(im->cr);
+
+                    cairo_set_line_width(im->cr, im->gdes[i].linewidth);
                     for (ii = 1; ii < im->xsize; ii++) {
                         if (isnan(im->gdes[i].p_data[ii])
                             || (im->slopemode == 1
                                 && isnan(im->gdes[i].p_data[ii - 1]))) {
                     for (ii = 1; ii < im->xsize; ii++) {
                         if (isnan(im->gdes[i].p_data[ii])
                             || (im->slopemode == 1
                                 && isnan(im->gdes[i].p_data[ii - 1]))) {
-                            node = NULL;
+                            draw_on = 0;
                             continue;
                         }
                             continue;
                         }
-                        if (node == NULL) {
+                        if (draw_on == 0) {
                             last_y = ytr(im, im->gdes[i].p_data[ii]);
                             if (im->slopemode == 0) {
                             last_y = ytr(im, im->gdes[i].p_data[ii]);
                             if (im->slopemode == 0) {
-                                node = gfx_new_line(im->canvas,
-                                                    ii - 1 + im->xorigin,
-                                                    last_y, ii + im->xorigin,
-                                                    last_y,
-                                                    im->gdes[i].linewidth,
-                                                    im->gdes[i].col);
+                                double    x = ii - 1 + im->xorigin;
+                                double    y = last_y;
+
+                                gfx_line_fit(im->cr, &x, &y);
+                                cairo_move_to(im->cr, x, y);
+                                x = ii + im->xorigin;
+                                y = last_y;
+                                gfx_line_fit(im->cr, &x, &y);
+                                cairo_line_to(im->cr, x, y);
                             } else {
                             } else {
-                                node = gfx_new_line(im->canvas,
-                                                    ii - 1 + im->xorigin,
-                                                    ytr(im,
-                                                        im->gdes[i].
-                                                        p_data[ii - 1]),
-                                                    ii + im->xorigin, last_y,
-                                                    im->gdes[i].linewidth,
-                                                    im->gdes[i].col);
+                                double    x = ii - 1 + im->xorigin;
+                                double    y = ytr(im,
+                                                  im->gdes[i].p_data[ii - 1]);
+
+                                gfx_line_fit(im->cr, &x, &y);
+                                cairo_move_to(im->cr, x, y);
+                                x = ii + im->xorigin;
+                                y = last_y;
+                                gfx_line_fit(im->cr, &x, &y);
+                                cairo_line_to(im->cr, x, y);
                             }
                             }
+                            draw_on = 1;
                         } else {
                         } else {
-                            double    new_y = ytr(im, im->gdes[i].p_data[ii]);
+                            double    x1 = ii + im->xorigin;
+                            double    y1 = ytr(im, im->gdes[i].p_data[ii]);
 
                             if (im->slopemode == 0
 
                             if (im->slopemode == 0
-                                && !AlmostEqual2sComplement(new_y, last_y,
-                                                            4)) {
-                                gfx_add_point(node, ii - 1 + im->xorigin,
-                                              new_y);
+                                && !AlmostEqual2sComplement(y1, last_y, 4)) {
+                                double    x = ii - 1 + im->xorigin;
+                                double    y = y1;
+
+                                gfx_line_fit(im->cr, &x, &y);
+                                cairo_line_to(im->cr, x, y);
                             };
                             };
-                            last_y = new_y;
-                            gfx_add_point(node, ii + im->xorigin, new_y);
+                            last_y = y1;
+                            gfx_line_fit(im->cr, &x1, &y1);
+                            cairo_line_to(im->cr, x1, y1);
                         };
 
                     }
                         };
 
                     }
+                    cairo_set_source_rgba(im->cr, im->gdes[i].col.red,
+                                          im->gdes[i].col.green,
+                                          im->gdes[i].col.blue,
+                                          im->gdes[i].col.alpha);
+                    cairo_set_line_cap(im->cr, CAIRO_LINE_CAP_ROUND);
+                    cairo_set_line_join(im->cr, CAIRO_LINE_JOIN_ROUND);
+                    cairo_stroke(im->cr);
+                    cairo_restore(im->cr);
                 } else {
                     int       idxI = -1;
                     double   *foreY = malloc(sizeof(double) * im->xsize * 2);
                 } else {
                     int       idxI = -1;
                     double   *foreY = malloc(sizeof(double) * im->xsize * 2);
@@ -3147,11 +3098,11 @@ int graph_paint(
                                                               4)) {
                                 cntI++;
                             }
                                                               4)) {
                                 cntI++;
                             }
-                            node = gfx_new_area(im->canvas,
-                                                backX[0], backY[0],
-                                                foreX[0], foreY[0],
-                                                foreX[cntI], foreY[cntI],
-                                                im->gdes[i].col);
+                            gfx_new_area(im->cr,
+                                         backX[0], backY[0],
+                                         foreX[0], foreY[0],
+                                         foreX[cntI], foreY[cntI],
+                                         im->gdes[i].col);
                             while (cntI < idxI) {
                                 lastI = cntI;
                                 cntI++;
                             while (cntI < idxI) {
                                 lastI = cntI;
                                 cntI++;
@@ -3165,9 +3116,10 @@ int graph_paint(
                                                                      1], 4)) {
                                     cntI++;
                                 }
                                                                      1], 4)) {
                                     cntI++;
                                 }
-                                gfx_add_point(node, foreX[cntI], foreY[cntI]);
+                                gfx_add_point(im->cr, foreX[cntI],
+                                              foreY[cntI]);
                             }
                             }
-                            gfx_add_point(node, backX[idxI], backY[idxI]);
+                            gfx_add_point(im->cr, backX[idxI], backY[idxI]);
                             while (idxI > 1) {
                                 lastI = idxI;
                                 idxI--;
                             while (idxI > 1) {
                                 lastI = idxI;
                                 idxI--;
@@ -3181,10 +3133,12 @@ int graph_paint(
                                                                      1], 4)) {
                                     idxI--;
                                 }
                                                                      1], 4)) {
                                     idxI--;
                                 }
-                                gfx_add_point(node, backX[idxI], backY[idxI]);
+                                gfx_add_point(im->cr, backX[idxI],
+                                              backY[idxI]);
                             }
                             idxI = -1;
                             drawem = 0;
                             }
                             idxI = -1;
                             drawem = 0;
+                            gfx_close_path(im->cr);
                         }
                         if (drawem != 0) {
                             drawem = 0;
                         }
                         if (drawem != 0) {
                             drawem = 0;
@@ -3193,10 +3147,6 @@ int graph_paint(
                         if (ii == im->xsize)
                             break;
 
                         if (ii == im->xsize)
                             break;
 
-                        /* keep things simple for now, just draw these bars
-                           do not try to build a big and complex area */
-
-
                         if (im->slopemode == 0 && ii == 0) {
                             continue;
                         }
                         if (im->slopemode == 0 && ii == 0) {
                             continue;
                         }
@@ -3214,8 +3164,7 @@ int graph_paint(
                             drawem = 1;
                             continue;
                         }
                             drawem = 1;
                             continue;
                         }
-                        /* every area has to be wound clock-wise,
-                           so we have to make sur base remains base  */
+
                         if (ybase > ytop) {
                             double    extra = ytop;
 
                         if (ybase > ytop) {
                             double    extra = ytop;
 
@@ -3253,20 +3202,6 @@ int graph_paint(
             }
             lastgdes = &(im->gdes[i]);
             break;
             }
             lastgdes = &(im->gdes[i]);
             break;
-#ifdef WITH_PIECHART
-        case GF_PART:
-            if (isnan(im->gdes[i].yrule))   /* fetch variable */
-                im->gdes[i].yrule = im->gdes[im->gdes[i].vidx].vf.val;
-
-            if (finite(im->gdes[i].yrule)) {    /* even the fetched var can be NaN */
-                pie_part(im, im->gdes[i].col,
-                         im->pie_x, im->pie_y, im->piesize * 0.4,
-                         M_PI * 2.0 * PieStart / 100.0,
-                         M_PI * 2.0 * (PieStart + im->gdes[i].yrule) / 100.0);
-                PieStart += im->gdes[i].yrule;
-            }
-            break;
-#endif
         case GF_STACK:
             rrd_set_error
                 ("STACK should already be turned into LINE or AREA here");
         case GF_STACK:
             rrd_set_error
                 ("STACK should already be turned into LINE or AREA here");
@@ -3275,13 +3210,6 @@ int graph_paint(
 
         }               /* switch */
     }
 
         }               /* switch */
     }
-#ifdef WITH_PIECHART
-    if (piechart == 2) {
-        im->draw_x_grid = 0;
-        im->draw_y_grid = 0;
-    }
-#endif
-
 
     /* grid_paint also does the text */
     if (!(im->extra_flags & ONLY_GRAPH))
 
     /* grid_paint also does the text */
     if (!(im->extra_flags & ONLY_GRAPH))
@@ -3298,19 +3226,19 @@ int graph_paint(
         case GF_HRULE:
             if (im->gdes[i].yrule >= im->minval
                 && im->gdes[i].yrule <= im->maxval)
         case GF_HRULE:
             if (im->gdes[i].yrule >= im->minval
                 && im->gdes[i].yrule <= im->maxval)
-                gfx_new_line(im->canvas,
-                             im->xorigin, ytr(im, im->gdes[i].yrule),
-                             im->xorigin + im->xsize, ytr(im,
-                                                          im->gdes[i].yrule),
-                             1.0, im->gdes[i].col);
+                gfx_line(im->cr,
+                         im->xorigin, ytr(im, im->gdes[i].yrule),
+                         im->xorigin + im->xsize, ytr(im,
+                                                      im->gdes[i].yrule),
+                         1.0, im->gdes[i].col);
             break;
         case GF_VRULE:
             if (im->gdes[i].xrule >= im->start
                 && im->gdes[i].xrule <= im->end)
             break;
         case GF_VRULE:
             if (im->gdes[i].xrule >= im->start
                 && im->gdes[i].xrule <= im->end)
-                gfx_new_line(im->canvas,
-                             xtr(im, im->gdes[i].xrule), im->yorigin,
-                             xtr(im, im->gdes[i].xrule),
-                             im->yorigin - im->ysize, 1.0, im->gdes[i].col);
+                gfx_line(im->cr,
+                         xtr(im, im->gdes[i].xrule), im->yorigin,
+                         xtr(im, im->gdes[i].xrule),
+                         im->yorigin - im->ysize, 1.0, im->gdes[i].col);
             break;
         default:
             break;
             break;
         default:
             break;
@@ -3318,22 +3246,18 @@ int graph_paint(
     }
 
 
     }
 
 
-    if (strcmp(im->graphfile, "-") == 0) {
-        fo = im->graphhandle ? im->graphhandle : stdout;
-#if defined(_WIN32) && !defined(__CYGWIN__) && !defined(__CYGWIN32__)
-        /* Change translation mode for stdout to BINARY */
-        _setmode(_fileno(fo), O_BINARY);
-#endif
-    } else {
-        if ((fo = fopen(im->graphfile, "wb")) == NULL) {
-            rrd_set_error("Opening '%s' for write: %s", im->graphfile,
-                          rrd_strerror(errno));
-            return (-1);
+    switch (im->imgformat) {
+    case IF_PNG:
+        if (cairo_surface_write_to_png(im->surface, im->graphfile) !=
+            CAIRO_STATUS_SUCCESS) {
+            rrd_set_error("Could not save png to '%s'", im->graphfile);
+            return 1;
         }
         }
+        break;
+    default:
+        cairo_show_page(im->cr);
+        break;
     }
     }
-    gfx_render(im->canvas, im->ximg, im->yimg, 0x00000000, fo);
-    if (strcmp(im->graphfile, "-") != 0)
-        fclose(fo);
     return 0;
 }
 
     return 0;
 }
 
@@ -3370,8 +3294,11 @@ int gdes_alloc(
     im->gdes[im->gdes_c - 1].data_first = 0;
     im->gdes[im->gdes_c - 1].p_data = NULL;
     im->gdes[im->gdes_c - 1].rpnp = NULL;
     im->gdes[im->gdes_c - 1].data_first = 0;
     im->gdes[im->gdes_c - 1].p_data = NULL;
     im->gdes[im->gdes_c - 1].rpnp = NULL;
-    im->gdes[im->gdes_c - 1].shift = 0;
-    im->gdes[im->gdes_c - 1].col = 0x0;
+    im->gdes[im->gdes_c - 1].shift = 0.0;
+    im->gdes[im->gdes_c - 1].col.red = 0.0;
+    im->gdes[im->gdes_c - 1].col.green = 0.0;
+    im->gdes[im->gdes_c - 1].col.blue = 0.0;
+    im->gdes[im->gdes_c - 1].col.alpha = 0.0;
     im->gdes[im->gdes_c - 1].legend[0] = '\0';
     im->gdes[im->gdes_c - 1].format[0] = '\0';
     im->gdes[im->gdes_c - 1].strftm = 0;
     im->gdes[im->gdes_c - 1].legend[0] = '\0';
     im->gdes[im->gdes_c - 1].format[0] = '\0';
     im->gdes[im->gdes_c - 1].strftm = 0;
@@ -3426,6 +3353,13 @@ int rrd_graph(
     image_desc_t im;
 
     rrd_graph_init(&im);
     image_desc_t im;
 
     rrd_graph_init(&im);
+
+    /* a dummy surface so that we can measure text sizes for placements */
+    im.surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 10, 10);
+    im.cr = cairo_create(im.surface);
+
+
+    /* not currently using this ... */
     im.graphhandle = stream;
 
     rrd_graph_options(argc, argv, &im);
     im.graphhandle = stream;
 
     rrd_graph_options(argc, argv, &im);
@@ -3489,8 +3423,7 @@ int rrd_graph(
         }
 
         sprintf((*prdata)[0], im.imginfo, filename,
         }
 
         sprintf((*prdata)[0], im.imginfo, filename,
-                (long) (im.canvas->zoom * im.ximg),
-                (long) (im.canvas->zoom * im.yimg));
+                (long) (im.zoom * im.ximg), (long) (im.zoom * im.yimg));
     }
     im_free(&im);
     return 0;
     }
     im_free(&im);
     return 0;
@@ -3529,6 +3462,9 @@ void rrd_graph_init(
     im->forceleftspace = 0;
     im->symbol = ' ';
     im->viewfactor = 1.0;
     im->forceleftspace = 0;
     im->symbol = ' ';
     im->viewfactor = 1.0;
+    im->imgformat = IF_PNG;
+    im->cr = NULL;
+    im->surface = NULL;
     im->extra_flags = 0;
     im->rigid = 0;
     im->gridfit = 1;
     im->extra_flags = 0;
     im->rigid = 0;
     im->gridfit = 1;
@@ -3543,10 +3479,10 @@ void rrd_graph_init(
     im->prt_c = 0;
     im->gdes_c = 0;
     im->gdes = NULL;
     im->prt_c = 0;
     im->gdes_c = 0;
     im->gdes = NULL;
-    im->canvas = gfx_new_canvas();
     im->grid_dash_on = 1;
     im->grid_dash_off = 1;
     im->tabwidth = 40.0;
     im->grid_dash_on = 1;
     im->grid_dash_off = 1;
     im->tabwidth = 40.0;
+    im->zoom = 1;
 
     for (i = 0; i < DIM(graph_col); i++)
         im->graph_col[i] = graph_col[i];
 
     for (i = 0; i < DIM(graph_col); i++)
         im->graph_col[i] = graph_col[i];
@@ -3600,7 +3536,7 @@ void rrd_graph_options(
     time_t    start_tmp = 0, end_tmp = 0;
     long      long_tmp;
     struct rrd_time_value start_tv, end_tv;
     time_t    start_tmp = 0, end_tmp = 0;
     long      long_tmp;
     struct rrd_time_value start_tv, end_tv;
-    gfx_color_t color;
+    long unsigned int color;
 
     optind = 0;
     opterr = 0;         /* initialize getopt */
 
     optind = 0;
     opterr = 0;         /* initialize getopt */
@@ -3827,7 +3763,7 @@ void rrd_graph_options(
             im->extra_flags |= FULL_SIZE_MODE;
             break;
         case 'i':
             im->extra_flags |= FULL_SIZE_MODE;
             break;
         case 'i':
-            im->canvas->interlaced = 1;
+            /* interlaced png not supported at the moment */
             break;
         case 'r':
             im->rigid = 1;
             break;
         case 'r':
             im->rigid = 1;
@@ -3836,7 +3772,7 @@ void rrd_graph_options(
             im->imginfo = optarg;
             break;
         case 'a':
             im->imginfo = optarg;
             break;
         case 'a':
-            if ((int) (im->canvas->imgformat = if_conv(optarg)) == -1) {
+            if ((int) (im->imgformat = if_conv(optarg)) == -1) {
                 rrd_set_error("unsupported graphics format '%s'", optarg);
                 return;
             }
                 rrd_set_error("unsupported graphics format '%s'", optarg);
                 return;
             }
@@ -3881,7 +3817,7 @@ void rrd_graph_options(
                     return;
                 }
                 if ((ci = grc_conv(col_nam)) != -1) {
                     return;
                 }
                 if ((ci = grc_conv(col_nam)) != -1) {
-                    im->graph_col[ci] = color;
+                    im->graph_col[ci] = gfx_hex_to_col(color);
                 } else {
                     rrd_set_error("invalid color name '%s'", col_nam);
                     return;
                 } else {
                     rrd_set_error("invalid color name '%s'", col_nam);
                     return;
@@ -3922,8 +3858,8 @@ void rrd_graph_options(
             break;
         }
         case 'm':
             break;
         }
         case 'm':
-            im->canvas->zoom = atof(optarg);
-            if (im->canvas->zoom <= 0.0) {
+            im->zoom = atof(optarg);
+            if (im->zoom <= 0.0) {
                 rrd_set_error("zoom factor must be > 0");
                 return;
             }
                 rrd_set_error("zoom factor must be > 0");
                 return;
             }
@@ -3934,20 +3870,11 @@ void rrd_graph_options(
             break;
 
         case 'R':
             break;
 
         case 'R':
-            if (strcmp(optarg, "normal") == 0)
-                im->canvas->aa_type = AA_NORMAL;
-            else if (strcmp(optarg, "light") == 0)
-                im->canvas->aa_type = AA_LIGHT;
-            else if (strcmp(optarg, "mono") == 0)
-                im->canvas->aa_type = AA_NONE;
-            else {
-                rrd_set_error("unknown font-render-mode '%s'", optarg);
-                return;
-            }
+            /* not supported curently */
             break;
 
         case 'B':
             break;
 
         case 'B':
-            im->canvas->font_aa_threshold = atof(optarg);
+            /* not supported curently */
             break;
 
         case 'W':
             break;
 
         case 'W':
@@ -4016,7 +3943,7 @@ int rrd_graph_color(
     } else {
         int       n = 0;
         char     *rest;
     } else {
         int       n = 0;
         char     *rest;
-        gfx_color_t col;
+        long unsigned int col;
 
         rest = strstr(color, ":");
         if (rest != NULL)
 
         rest = strstr(color, ":");
         if (rest != NULL)
@@ -4040,7 +3967,7 @@ int rrd_graph_color(
         }
         if (rrd_test_error())
             return 0;
         }
         if (rrd_test_error())
             return 0;
-        gdp->col = col;
+        gdp->col = gfx_hex_to_col(col);
         return n;
     }
 }
         return n;
     }
 }
index 2c9309b..dd03615 100644 (file)
@@ -101,7 +101,6 @@ typedef struct ylab_t {
     int       lfac[4];  /* associated label spacing */
 } ylab_t;
 
     int       lfac[4];  /* associated label spacing */
 } ylab_t;
 
-
 /* this structure describes the elements which can make up a graph.
    because they are quite diverse, not all elements will use all the
    possible parts of the structure. */
 /* this structure describes the elements which can make up a graph.
    because they are quite diverse, not all elements will use all the
    possible parts of the structure. */
@@ -122,7 +121,7 @@ typedef struct graph_desc_t {
     long      ds;       /* data source number */
     enum cf_en cf;      /* consolidation function */
     enum cf_en cf_reduce;   /* consolidation function for reduce_data() */
     long      ds;       /* data source number */
     enum cf_en cf;      /* consolidation function */
     enum cf_en cf_reduce;   /* consolidation function for reduce_data() */
-    gfx_color_t col;    /* graph color */
+    struct gfx_color_t col; /* graph color */
     char      format[FMT_LEG_LEN + 5];  /* format for PRINT AND GPRINT */
     char      legend[FMT_LEG_LEN + 5];  /* legend */
     int       strftm;   /* should the VDEF legend be formated with strftime */
     char      format[FMT_LEG_LEN + 5];  /* format for PRINT AND GPRINT */
     char      legend[FMT_LEG_LEN + 5];  /* legend */
     int       strftm;   /* should the VDEF legend be formated with strftime */
@@ -160,7 +159,7 @@ typedef struct image_desc_t {
 #ifdef WITH_PIECHART
     long      piesize;  /* size of the piechart */
 #endif
 #ifdef WITH_PIECHART
     long      piesize;  /* size of the piechart */
 #endif
-    gfx_color_t graph_col[__GRC_END__]; /* real colors for the graph */
+    struct gfx_color_t graph_col[__GRC_END__];  /* real colors for the graph */
     text_prop_t text_prop[TEXT_PROP_LAST];  /* text properties */
     char      ylegend[210]; /* legend along the yaxis */
     char      title[210];   /* title for graph */
     text_prop_t text_prop[TEXT_PROP_LAST];  /* text properties */
     char      ylegend[210]; /* legend along the yaxis */
     char      title[210];   /* title for graph */
@@ -184,6 +183,7 @@ typedef struct image_desc_t {
                            grindlines falls in integer pixel values */
     char     *imginfo;  /* construct an <IMG ... tag and return 
                            as first retval */
                            grindlines falls in integer pixel values */
     char     *imginfo;  /* construct an <IMG ... tag and return 
                            as first retval */
+    enum gfx_if_en imgformat;   /* image format */
     int       lazy;     /* only update the image if there is
                            reasonable probablility that the
                            existing one is out of date */
     int       lazy;     /* only update the image if there is
                            reasonable probablility that the
                            existing one is out of date */
@@ -197,6 +197,7 @@ typedef struct image_desc_t {
     long      pie_x, pie_y; /* where is the centerpoint */
 #endif
     long      ximg, yimg;   /* total size of the image */
     long      pie_x, pie_y; /* where is the centerpoint */
 #endif
     long      ximg, yimg;   /* total size of the image */
+    double    zoom;
     double    magfact;  /* numerical magnitude */
     long      base;     /* 1000 or 1024 depending on what we graph */
     char      symbol;   /* magnitude symbol for y-axis */
     double    magfact;  /* numerical magnitude */
     long      base;     /* 1000 or 1024 depending on what we graph */
     char      symbol;   /* magnitude symbol for y-axis */
@@ -211,7 +212,8 @@ typedef struct image_desc_t {
     long      prt_c;    /* number of print elements */
     long      gdes_c;   /* number of graphics elements */
     graph_desc_t *gdes; /* points to an array of graph elements */
     long      prt_c;    /* number of print elements */
     long      gdes_c;   /* number of graphics elements */
     graph_desc_t *gdes; /* points to an array of graph elements */
-    gfx_canvas_t *canvas;   /* graphics library */
+    cairo_surface_t *surface;   /* graphics library */
+    cairo_t  *cr;       /* drawin context */
 } image_desc_t;
 
 /* Prototypes */
 } image_desc_t;
 
 /* Prototypes */
index 2ea3a2d..0991b3b 100644 (file)
@@ -266,7 +266,7 @@ int rrd_parse_color(
     default:
         return 1;       /* wrong number of digits */
     }
     default:
         return 1;       /* wrong number of digits */
     }
-    gdp->col = r << 24 | g << 16 | b << 8 | a;
+    gdp->col = gfx_hex_to_col(r << 24 | g << 16 | b << 8 | a);
     return 0;
 }
 
     return 0;
 }
 
@@ -497,23 +497,22 @@ int rrd_parse_PVHLAST(
     static int spacecnt = 0;
 
     if (spacecnt == 0) {
     static int spacecnt = 0;
 
     if (spacecnt == 0) {
-        float     one_space = gfx_get_text_width(im->canvas, 0,
+        float     one_space = gfx_get_text_width(im->cr, 0,
                                                  im->
                                                  text_prop[TEXT_PROP_LEGEND].
                                                  font,
                                                  im->
                                                  text_prop[TEXT_PROP_LEGEND].
                                                  size,
                                                  im->
                                                  text_prop[TEXT_PROP_LEGEND].
                                                  font,
                                                  im->
                                                  text_prop[TEXT_PROP_LEGEND].
                                                  size,
-                                                 im->tabwidth, "    ",
-                                                 0) / 4.0;
-        float     target_space = gfx_get_text_width(im->canvas, 0,
+                                                 im->tabwidth, "    ") / 4.0;
+        float     target_space = gfx_get_text_width(im->cr, 0,
                                                     im->
                                                     text_prop
                                                     [TEXT_PROP_LEGEND].font,
                                                     im->
                                                     text_prop
                                                     [TEXT_PROP_LEGEND].size,
                                                     im->
                                                     text_prop
                                                     [TEXT_PROP_LEGEND].font,
                                                     im->
                                                     text_prop
                                                     [TEXT_PROP_LEGEND].size,
-                                                    im->tabwidth, "oo", 0);
+                                                    im->tabwidth, "oo");
 
         spacecnt = target_space / one_space;
         dprintf("- spacecnt: %i onespace: %f targspace: %f\n", spacecnt,
 
         spacecnt = target_space / one_space;
         dprintf("- spacecnt: %i onespace: %f targspace: %f\n", spacecnt,
@@ -607,7 +606,8 @@ int rrd_parse_PVHLAST(
             rrd_set_error("Could not parse color in '%s'", &tmpstr[j]);
             return 1;
         }
             rrd_set_error("Could not parse color in '%s'", &tmpstr[j]);
             return 1;
         }
-        dprintf("- parsed color 0x%08x\n", (unsigned int) gdp->col);
+        dprintf("- parsed color %0.0f,%0.0f,%0.0f,%0.0f\n", gdp->col.red,
+                gdp->col.green, gdp->col.blue, gdp->col.alpha);
         colorfound = 1;
     } else {
         dprintf("- no color present in '%s'\n", tmpstr);
         colorfound = 1;
     } else {
         dprintf("- no color present in '%s'\n", tmpstr);