summarylogtreecommitdiffstats
diff options
context:
space:
mode:
authorHsiu-Ming Chang2020-08-14 21:50:36 +0800
committerHsiu-Ming Chang2020-08-14 22:18:16 +0800
commit819c53ebacb2113104ac5131ee2e4189497d3b5b (patch)
treeedc736973ef62fc390cfa70fb984cb373a4c2947
downloadaur-819c53ebacb2113104ac5131ee2e4189497d3b5b.tar.gz
Initial commit
-rw-r--r--.SRCINFO34
-rw-r--r--0001-Set-noexecstack-on-linker-generated-binary-data-files.patch24
-rw-r--r--0002-pymupdf.patch301
-rw-r--r--PKGBUILD71
-rw-r--r--mupdf.desktop15
-rw-r--r--mupdf.xpm497
6 files changed, 942 insertions, 0 deletions
diff --git a/.SRCINFO b/.SRCINFO
new file mode 100644
index 00000000000..625216202cc
--- /dev/null
+++ b/.SRCINFO
@@ -0,0 +1,34 @@
+pkgbase = libmupdf-pymupdf
+ pkgdesc = Lightweight PDF and XPS viewer with patch to build PyMuPDF
+ pkgver = 1.17.0
+ pkgrel = 2
+ url = https://mupdf.com/
+ arch = x86_64
+ license = AGPL3
+ makedepends = desktop-file-utils
+ makedepends = freetype2
+ makedepends = freeglut
+ makedepends = glu
+ makedepends = harfbuzz
+ makedepends = jbig2dec
+ makedepends = libjpeg
+ makedepends = mesa-libgl
+ makedepends = openjpeg2
+ makedepends = libxext
+ provides = libmupdf=1.17.0
+ conflicts = libmupdf
+ options = staticlibs
+ source = https://mupdf.com/downloads/archive/mupdf-1.17.0-source.tar.xz
+ source = 0001-Set-noexecstack-on-linker-generated-binary-data-files.patch
+ source = 0002-pymupdf.patch
+ source = mupdf.desktop
+ source = mupdf.xpm
+ sha256sums = c935fb2593d9a28d9b56b59dad6e3b0716a6790f8a257a68fa7dcb4430bc6086
+ sha256sums = 53e3ccc9dd613277a1cfb99dcf7e71216c8497a84f6a7663a2fbff9d58a10be5
+ sha256sums = e1c908e0126fdcd2cb1fa6a8ee72e373ee3cc4f9c30ced0b09ea44a98e25f272
+ sha256sums = ccff66979249bd4ab4ba8918660f194eb90eb0ae231b16e36a6cecdcf471883f
+ sha256sums = a435f44425f5432c074dee745d8fbaeb879038ec1f1ec64f037c74662f09aca8
+
+pkgname = libmupdf-pymupdf
+ pkgdesc = Library for Lightweight PDF and XPS viewer
+
diff --git a/0001-Set-noexecstack-on-linker-generated-binary-data-files.patch b/0001-Set-noexecstack-on-linker-generated-binary-data-files.patch
new file mode 100644
index 00000000000..8b44749edff
--- /dev/null
+++ b/0001-Set-noexecstack-on-linker-generated-binary-data-files.patch
@@ -0,0 +1,24 @@
+From: Tor Andersson <tor.andersson@artifex.com>
+Date: Thu, 4 Jun 2020 14:38:01 +0000 (+0200)
+Subject: Set noexecstack on linker-generated binary data files.
+X-Git-Url: https://git.ghostscript.com/?p=mupdf.git;a=commitdiff_plain;h=e52e0c2c0297d70d0e4fc293ccd047becb18f322;hp=a86b1fa0119edef1683dc06f035bd329b54613a5
+
+Set noexecstack on linker-generated binary data files.
+
+This will prevent the linker from flagging the mupdf library and
+executables as needing an executable stack.
+---
+
+diff --git a/Makefile b/Makefile
+index f812ac074..417663dd8 100644
+--- a/Makefile
++++ b/Makefile
+@@ -64,7 +64,7 @@ endif
+ LINK_CMD = $(QUIET_LINK) $(MKTGTDIR) ; $(CC) $(LDFLAGS) -o $@ $^ $(LIBS)
+ TAGS_CMD = $(QUIET_TAGS) ctags -R --c-kinds=+p
+ WINDRES_CMD = $(QUIET_WINDRES) $(MKTGTDIR) ; $(WINDRES) $< $@
+-OBJCOPY_CMD = $(QUIET_OBJCOPY) $(MKTGTDIR) ; $(LD) -r -b binary -o $@ $<
++OBJCOPY_CMD = $(QUIET_OBJCOPY) $(MKTGTDIR) ; $(LD) -r -b binary -z noexecstack -o $@ $<
+
+ # --- Rules ---
+
diff --git a/0002-pymupdf.patch b/0002-pymupdf.patch
new file mode 100644
index 00000000000..a57853cec25
--- /dev/null
+++ b/0002-pymupdf.patch
@@ -0,0 +1,301 @@
+diff -ru mupdf-1.17.0-source-orig/include/mupdf/fitz/config.h mupdf-1.17.0-source/include/mupdf/fitz/config.h
+--- mupdf-1.17.0-source-orig/include/mupdf/fitz/config.h 2020-05-05 19:29:09.000000000 +0800
++++ mupdf-1.17.0-source/include/mupdf/fitz/config.h 2020-08-09 23:10:55.615700000 +0800
+@@ -2,13 +2,13 @@
+
+ #define FZ_CONFIG_H
+
+-/**
++/*
+ Enable the following for spot (and hence overprint/overprint
+ simulation) capable rendering. This forces FZ_PLOTTERS_N on.
+ */
+ /* #define FZ_ENABLE_SPOT_RENDERING 1 */
+
+-/**
++/*
+ Choose which plotters we need.
+ By default we build all the plotters in. To avoid building
+ plotters in that aren't needed, define the unwanted
+@@ -19,7 +19,7 @@
+ /* #define FZ_PLOTTERS_CMYK 1 */
+ /* #define FZ_PLOTTERS_N 1 */
+
+-/**
++/*
+ Choose which document agents to include.
+ By default all are enabled. To avoid building unwanted
+ ones, define FZ_ENABLE_... to 0.
+@@ -32,12 +32,12 @@
+ /* #define FZ_ENABLE_HTML 1 */
+ /* #define FZ_ENABLE_EPUB 1 */
+
+-/**
++/*
+ Choose whether to enable ICC color profiles.
+ */
+-/* #define FZ_ENABLE_ICC 1 */
++#define FZ_ENABLE_ICC 1
+
+-/**
++/*
+ Choose whether to enable JPEG2000 decoding.
+ By default, it is enabled, but due to frequent security
+ issues with the third party libraries we support disabling
+@@ -45,14 +45,13 @@
+ */
+ /* #define FZ_ENABLE_JPX 1 */
+
+-/**
++/*
+ Choose whether to enable JavaScript.
+- By default JavaScript is enabled both for mutool and PDF
+- interactivity.
++ By default JavaScript is enabled both for mutool and PDF interactivity.
+ */
+ /* #define FZ_ENABLE_JS 1 */
+
+-/**
++/*
+ Choose which fonts to include.
+ By default we include the base 14 PDF fonts,
+ DroidSansFallback from Android for CJK, and
+@@ -61,35 +60,32 @@
+ unwanted fonts.
+ */
+ /* To avoid all noto fonts except CJK, enable: */
+-/* #define TOFU */
++#define TOFU // <=== PyMuPDF: not the complete NOTO!
+
+-/* To skip the CJK font, enable: (this implicitly enables TOFU_CJK_EXT
+- * and TOFU_CJK_LANG) */
++/* To skip the CJK font, enable: (this implicitly enables TOFU_CJK_EXT and TOFU_CJK_LANG) */
+ /* #define TOFU_CJK */
+
+-/* To skip CJK Extension A, enable: (this implicitly enables
+- * TOFU_CJK_LANG) */
+-/* #define TOFU_CJK_EXT */
++/* To skip CJK Extension A, enable: (this implicitly enables TOFU_CJK_LANG) */
++#define TOFU_CJK_EXT // <=== PyMuPDF: causes 1.5 MB extra size
+
+ /* To skip CJK language specific fonts, enable: */
+-/* #define TOFU_CJK_LANG */
++#define TOFU_CJK_LANG // <=== PyMuPDF
+
+ /* To skip the Emoji font, enable: */
+-/* #define TOFU_EMOJI */
++#define TOFU_EMOJI // <=== PyMuPDF
+
+ /* To skip the ancient/historic scripts, enable: */
+-/* #define TOFU_HISTORIC */
++#define TOFU_HISTORIC // <=== PyMuPDF
+
+ /* To skip the symbol font, enable: */
+-/* #define TOFU_SYMBOL */
++#define TOFU_SYMBOL // <=== PyMuPDF
+
+ /* To skip the SIL fonts, enable: */
+-/* #define TOFU_SIL */
++// #define TOFU_SIL // <=== PyMuPDF: ok to have it, only small fonts
+
+ /* To skip the Base14 fonts, enable: */
+ /* #define TOFU_BASE14 */
+-/* (You probably really don't want to do that except for measurement
+- * purposes!) */
++/* (You probably really don't want to do that except for measurement purposes!) */
+
+ /* ---------- DO NOT EDIT ANYTHING UNDER THIS LINE ---------- */
+
+diff -ru mupdf-1.17.0-source-orig/source/fitz/encode-fax.c mupdf-1.17.0-source/source/fitz/encode-fax.c
+--- mupdf-1.17.0-source-orig/source/fitz/encode-fax.c 2020-05-05 19:29:09.000000000 +0800
++++ mupdf-1.17.0-source/source/fitz/encode-fax.c 2020-08-09 23:10:55.615700000 +0800
+@@ -120,7 +120,7 @@
+ {
+ int a, b;
+
+- if (!line)
++ if (!line || x >= w)
+ return w;
+
+ if (x == -1)
+@@ -147,7 +147,7 @@
+ static inline int
+ find_changing_color(const unsigned char *line, int x, int w, int color)
+ {
+- if (!line)
++ if (!line || x >= w)
+ return w;
+ x = find_changing(line, x, w);
+ if (x < w && getbit(line, x) != color)
+diff -ru mupdf-1.17.0-source-orig/source/pdf/pdf-font-add.c mupdf-1.17.0-source/source/pdf/pdf-font-add.c
+--- mupdf-1.17.0-source-orig/source/pdf/pdf-font-add.c 2020-05-05 19:29:09.000000000 +0800
++++ mupdf-1.17.0-source/source/pdf/pdf-font-add.c 2020-08-09 23:10:55.615700000 +0800
+@@ -21,10 +21,14 @@
+ #else
+ const char *kind = FT_Get_X11_Font_Format(face);
+ #endif
+- if (!strcmp(kind, "TrueType")) return 2;
+- if (!strcmp(kind, "Type 1")) return 1;
+- if (!strcmp(kind, "CFF")) return 3;
+- if (!strcmp(kind, "CID Type 1")) return 1;
++ if (!strcmp(kind, "TrueType"))
++ return 2;
++ if (!strcmp(kind, "Type 1"))
++ return 1;
++ if (!strcmp(kind, "CFF"))
++ return 3;
++ if (!strcmp(kind, "CID Type 1"))
++ return 1;
+ return 0;
+ }
+
+@@ -54,7 +58,7 @@
+ return fz_lookup_base14_font(ctx, pdf_clean_font_name(font->name), &size) == data;
+ }
+
+-static pdf_obj*
++static pdf_obj *
+ pdf_add_font_file(fz_context *ctx, pdf_document *doc, fz_font *font)
+ {
+ fz_buffer *buf = font->buffer;
+@@ -136,9 +140,15 @@
+ switch (ft_font_file_kind(face))
+ {
+ default:
+- case 1: pdf_dict_put_drop(ctx, fdobj, PDF_NAME(FontFile), fileref); break;
+- case 2: pdf_dict_put_drop(ctx, fdobj, PDF_NAME(FontFile2), fileref); break;
+- case 3: pdf_dict_put_drop(ctx, fdobj, PDF_NAME(FontFile3), fileref); break;
++ case 1:
++ pdf_dict_put_drop(ctx, fdobj, PDF_NAME(FontFile), fileref);
++ break;
++ case 2:
++ pdf_dict_put_drop(ctx, fdobj, PDF_NAME(FontFile2), fileref);
++ break;
++ case 3:
++ pdf_dict_put_drop(ctx, fdobj, PDF_NAME(FontFile3), fileref);
++ break;
+ }
+ }
+
+@@ -151,7 +161,7 @@
+ }
+
+ static void
+-pdf_add_simple_font_widths(fz_context *ctx, pdf_document *doc, pdf_obj *fobj, fz_font *font, const char * const encoding[])
++pdf_add_simple_font_widths(fz_context *ctx, pdf_document *doc, pdf_obj *fobj, fz_font *font, const char *const encoding[])
+ {
+ int width_table[256];
+ pdf_obj *widths;
+@@ -196,7 +206,12 @@
+ }
+
+ /* Different states of starting, same width as last, or consecutive glyph */
+-enum { FW_START, FW_SAME, FW_RUN };
++enum
++{
++ FW_START,
++ FW_SAME,
++ FW_RUN
++};
+
+ /* ToDo: Ignore the default sized characters */
+ static void
+@@ -329,7 +344,7 @@
+ }
+
+ /* Descendant font construction used for CID font creation from ttf or Adobe type1 */
+-static pdf_obj*
++static pdf_obj *
+ pdf_add_descendant_cid_font(fz_context *ctx, pdf_document *doc, fz_font *font)
+ {
+ FT_Face face = font->ft_face;
+@@ -372,9 +387,9 @@
+ int n;
+ for (n = 1; k + n < size; ++n)
+ {
+- if ((k & 0xFF00) != ((k+n) & 0xFF00)) /* high byte changes */
++ if ((k & 0xFF00) != ((k + n) & 0xFF00)) /* high byte changes */
+ break;
+- if (table[k] + n != table[k+n])
++ if (table[k] + n != table[k + n])
+ break;
+ }
+ return n;
+@@ -474,7 +489,7 @@
+ fz_append_printf(ctx, buf, "%d beginbfrange\n", num_seq);
+ count = 0;
+ }
+- fz_append_printf(ctx, buf, "<%04x> <%04x> <%04x>\n", k, k+n-1, table[k]);
++ fz_append_printf(ctx, buf, "<%04x> <%04x> <%04x>\n", k, k + n - 1, table[k]);
+ ++count;
+ }
+ }
+@@ -582,7 +597,7 @@
+ const char *glyph = glyph_names[i];
+ if (glyph)
+ {
+- if (last != i-1)
++ if (last != i - 1)
+ pdf_array_push_int(ctx, diff, i);
+ last = i;
+ pdf_array_push_name(ctx, diff, glyph);
+@@ -624,9 +639,15 @@
+ switch (encoding)
+ {
+ default:
+- case PDF_SIMPLE_ENCODING_LATIN: enc = fz_glyph_name_from_windows_1252; break;
+- case PDF_SIMPLE_ENCODING_GREEK: enc = fz_glyph_name_from_iso8859_7; break;
+- case PDF_SIMPLE_ENCODING_CYRILLIC: enc = fz_glyph_name_from_koi8u; break;
++ case PDF_SIMPLE_ENCODING_LATIN:
++ enc = fz_glyph_name_from_windows_1252;
++ break;
++ case PDF_SIMPLE_ENCODING_GREEK:
++ enc = fz_glyph_name_from_iso8859_7;
++ break;
++ case PDF_SIMPLE_ENCODING_CYRILLIC:
++ enc = fz_glyph_name_from_koi8u;
++ break;
+ }
+
+ fobj = pdf_add_new_dict(ctx, doc, 10);
+@@ -667,8 +688,7 @@
+ return fref;
+ }
+
+-int
+-pdf_font_writing_supported(fz_font *font)
++int pdf_font_writing_supported(fz_font *font)
+ {
+ if (font->ft_face == NULL || font->buffer == NULL || font->buffer->len < 4)
+ return 0;
+@@ -686,7 +706,7 @@
+ {
+ pdf_obj *fref, *font, *subfont, *fontdesc;
+ pdf_obj *dfonts;
+- fz_rect bbox = { -200, -200, 1200, 1200 };
++ fz_rect bbox = {-200, -200, 1200, 1200};
+ unsigned char digest[16];
+ int flags;
+
+@@ -769,3 +789,21 @@
+
+ return fref;
+ }
++
++void jm_valid_chars(fz_context *ctx, fz_font *font, void *arr)
++{
++ FT_Face face = font->ft_face;
++ FT_ULong ucs;
++ FT_UInt gid;
++ long *table = (long *)arr;
++ fz_lock(ctx, FZ_LOCK_FREETYPE);
++ ucs = FT_Get_First_Char(face, &gid);
++ while (gid > 0)
++ {
++ if (gid < (FT_ULong)face->num_glyphs && face->num_glyphs > 0)
++ table[gid] = (long)ucs;
++ ucs = FT_Get_Next_Char(face, ucs, &gid);
++ }
++ fz_unlock(ctx, FZ_LOCK_FREETYPE);
++ return;
++}
diff --git a/PKGBUILD b/PKGBUILD
new file mode 100644
index 00000000000..db5a11c6c63
--- /dev/null
+++ b/PKGBUILD
@@ -0,0 +1,71 @@
+# Maintainer: Hsiu-Ming Chang <cges30901@gmail.com>
+# Contributor: Christian Hesse <mail@eworm.de>
+# Contributor: Bartłomiej Piotrowski <bpiotrowski@archlinux.org>
+# Contributor: Brad Fanella <bradfanella@archlinux.us>
+# Contributor: Stefan Husmann <stefan-husmann@t-online.de>
+# Contributor: Pierre-Paul Paquin <pierrepaulpaquin@gmail.com>
+# Contributor: xduugu
+
+pkgname=libmupdf-pymupdf
+pkgver=1.17.0
+pkgrel=2
+pkgdesc='Lightweight PDF and XPS viewer with patch to build PyMuPDF'
+arch=('x86_64')
+url='https://mupdf.com/'
+license=('AGPL3')
+makedepends=('desktop-file-utils' 'freetype2' 'freeglut' 'glu' 'harfbuzz'
+ 'jbig2dec' 'libjpeg' 'mesa-libgl' 'openjpeg2' 'libxext')
+# we need static libs for zathura-pdf-mupdf
+provides=('libmupdf=1.17.0')
+conflicts=('libmupdf')
+options=('staticlibs')
+source=("https://mupdf.com/downloads/archive/mupdf-${pkgver/_/}-source.tar.xz"
+ '0001-Set-noexecstack-on-linker-generated-binary-data-files.patch'
+ '0002-pymupdf.patch'
+ 'mupdf.desktop'
+ 'mupdf.xpm')
+sha256sums=('c935fb2593d9a28d9b56b59dad6e3b0716a6790f8a257a68fa7dcb4430bc6086'
+ '53e3ccc9dd613277a1cfb99dcf7e71216c8497a84f6a7663a2fbff9d58a10be5'
+ 'e1c908e0126fdcd2cb1fa6a8ee72e373ee3cc4f9c30ced0b09ea44a98e25f272'
+ 'ccff66979249bd4ab4ba8918660f194eb90eb0ae231b16e36a6cecdcf471883f'
+ 'a435f44425f5432c074dee745d8fbaeb879038ec1f1ec64f037c74662f09aca8')
+
+prepare() {
+ cd mupdf-${pkgver/_/}-source
+
+ # remove bundled packages, we want our system libraries
+ rm -rf thirdparty/{freeglut,freetype,harfbuzz,jbig2dec,libjpeg,openjpeg,zlib}
+
+ # Set noexecstack on linker-generated binary data files.
+ patch -Np1 < ../0001-Set-noexecstack-on-linker-generated-binary-data-files.patch
+
+ # Add patch to build PyMuPDF
+ patch -Np1 < ../0002-pymupdf.patch
+}
+
+build() {
+ CFLAGS+=' -fPIC'
+ CXXFLAGS+=' -fPIC'
+ export CFLAGS CXXFLAGS
+
+ USE_SYSTEM_LIBS='yes'
+ export USE_SYSTEM_LIBS
+
+ cd mupdf-${pkgver/_/}-source
+ make build=release libs apps
+}
+
+package() {
+ pkgdesc='Library for Lightweight PDF and XPS viewer'
+
+ cd mupdf-${pkgver/_/}-source
+
+ make build=release prefix="$pkgdir"/usr install
+
+ rm -rf "$pkgdir"/usr/{bin,share/man}
+ mv "$pkgdir"/usr/share/doc/mupdf "$pkgdir"/usr/share/doc/libmupdf
+
+ find "$pkgdir"/usr/include "$pkgdir"/usr/share "$pkgdir"/usr/lib \
+ -type f -exec chmod 0644 {} +
+}
+
diff --git a/mupdf.desktop b/mupdf.desktop
new file mode 100644
index 00000000000..78c5a75a234
--- /dev/null
+++ b/mupdf.desktop
@@ -0,0 +1,15 @@
+[Desktop Entry]
+Name=MuPDF
+GenericName=PDF file viewer
+Exec=mupdf %f
+TryExec=mupdf
+Icon=mupdf
+Terminal=false
+Type=Application
+MimeType=application/epub+zip;application/pdf;application/x-pdf;application/x-cbz;application/oxps;application/vnd.ms-xpsdocument;image/jpeg;image/pjpeg;image/png;image/tiff;image/x-tiff
+Categories=Viewer;Graphics;
+Actions=View
+NoDisplay=true
+[Desktop Action View]
+Name=View with mupdf
+Exec=mupdf %f
diff --git a/mupdf.xpm b/mupdf.xpm
new file mode 100644
index 00000000000..2c042f4ea8e
--- /dev/null
+++ b/mupdf.xpm
@@ -0,0 +1,497 @@
+/* XPM */
+static char *mupdf[] = {
+/* width height ncolors chars_per_pixel */
+"48 48 442 2",
+/* colors */
+" c #000000",
+" . c #2E4558",
+" X c #252121",
+" o c #AFAFAF",
+" O c #28313B",
+" + c #231F1F",
+" @ c #686666",
+" # c #98BDD7",
+" $ c #201B1C",
+" % c #7CABCC",
+" & c #4487B6",
+" * c #DFDEDE",
+" = c #4285B4",
+" - c #615E5F",
+" ; c #605E5E",
+" : c #23262C",
+" > c #D9D8D8",
+" , c #F7FAFC",
+" < c #D7D6D6",
+" 1 c #BFD6E6",
+" 2 c #6BA0C5",
+" 3 c #232122",
+" 4 c #555253",
+" 5 c #CDCCCC",
+" 6 c #E7EFF6",
+" 7 c #4786B2",
+" 8 c #CADDEA",
+" 9 c #4085B5",
+" 0 c #AECBDF",
+" q c #CBCACA",
+" w c #92B9D4",
+" e c #365F7D",
+" r c #5A95BE",
+" t c #3E83B3",
+" y c #304B60",
+" u c #C7C6C6",
+" i c #4D8EBB",
+" p c #F1F6F9",
+" a c #C1C0C0",
+" s c #454243",
+" d c #669CC3",
+" f c #81AECD",
+" g c #7A7777",
+" h c #434041",
+" j c #3E779F",
+" k c #272E36",
+" l c #413E3F",
+" z c #3F3C3D",
+" x c #5895BF",
+" c c #3D3A3B",
+" v c #C6DBE9",
+" b c #B8B6B7",
+" n c #4282B0",
+" m c #FDFDFE",
+" M c #B7B6B6",
+" N c #8DB5D2",
+" B c #242529",
+" V c #B3B2B2",
+" C c #222327",
+" Z c #B0AEAF",
+" A c #EDF4F8",
+" S c #686565",
+" D c #488AB9",
+" F c #9ABED8",
+" G c #7EACCD",
+" H c #ECF2F7",
+" J c #211C1C",
+" K c #666363",
+" L c #F1F1F2",
+" P c #ABAAAA",
+" I c #4588B6",
+" U c #A9A8A8",
+" Y c #2D2A2B",
+" T c #A7A6A6",
+" R c #615D5E",
+" E c #2B2829",
+" W c #8DB7D5",
+" Q c #F9FBFD",
+" ! c #DDE9F2",
+" ~ c #F8FBFC",
+" ^ c #DCE9F1",
+" / c #A5C5DC",
+" ( c #89B3D1",
+" ) c #5C5959",
+" _ c #A4C5DB",
+" ` c #335A76",
+" ' c #518FBB",
+" ] c #E6E7E7",
+" [ c #5A5757",
+" { c #232021",
+" } c #33536C",
+" | c #98BED9",
+". c #E0E1E1",
+".. c #7CACCE",
+".X c #4488B8",
+".o c #2D3F4F",
+".O c #999898",
+".+ c #4388B7",
+".@ c #5E98C1",
+".# c #CDCDCB",
+".$ c #524F4F",
+".% c #B0CCE0",
+".& c #979696",
+".* c #78A8CA",
+".= c #5C96BF",
+".- c #969495",
+".; c #4084B4",
+".: c #252930",
+".> c #949293",
+"., c #929091",
+".< c #417FAB",
+".1 c #4F8FBC",
+".2 c #F3F7FA",
+".3 c #D3D3D4",
+".4 c #D7E5EF",
+".5 c #222023",
+".6 c #9FC1D9",
+".7 c #679DC3",
+".8 c #37678A",
+".9 c #4B8BB8",
+".0 c #3E769E",
+".q c #3C749C",
+".w c #403D3D",
+".e c #92BAD6",
+".r c #C8DCEA",
+".t c #FEFEFE",
+".y c #3D393A",
+".u c #3B3738",
+".i c #355974",
+".p c #353132",
+".a c #7A7879",
+".s c #498BB9",
+".d c #9BBFD8",
+".f c #4E8AB4",
+".g c #787677",
+".h c #F2F2F2",
+".j c #F0F0F0",
+".k c #2F2B2C",
+".l c #EEEEEE",
+".z c #727071",
+".x c #26282D",
+".c c #ECECEC",
+".v c #2B2728",
+".b c #FAFCFD",
+".n c #EAEAEA",
+".m c #DEEAF2",
+".M c #E9EAE9",
+".N c #C2D8E7",
+".B c #6E6C6D",
+".V c #5390BC",
+".C c #E8E8E8",
+".Z c #6EA2C6",
+".A c #272324",
+".S c #E7E6E7",
+".D c #E6E6E6",
+".F c #252122",
+".G c #29333D",
+".H c #E4E4E4",
+".J c #3F7AA5",
+".K c #231F20",
+".L c #E2E2E2",
+".P c #211D1E",
+".I c #E0E0E0",
+".U c #EAF1F7",
+".Y c #6099C2",
+".T c #1F1B1C",
+".R c #E9F1F6",
+".E c #CDDFEB",
+".W c #4387B6",
+".Q c #96BBD6",
+".! c #B1CDE0",
+".~ c #DEDEDE",
+".^ c #79A9CA",
+"./ c #4285B5",
+".( c #272A31",
+".) c #5D97BF",
+"._ c #4185B4",
+".` c #DCDCDC",
+".' c #959393",
+".] c #DADADA",
+".[ c #314B5F",
+".{ c #D8D8D8",
+".} c #D7D8D7",
+".| c #D6D6D6",
+"X c #F5F8FB",
+"X. c #D4D4D4",
+"XX c #6AA0C5",
+"Xo c #BDD4E5",
+"XO c #3A6A8C",
+"X+ c #232123",
+"X@ c #D3D4D3",
+"X# c #D2D2D2",
+"X$ c #D0D0D0",
+"X% c #CECECE",
+"X& c #CCCCCC",
+"X* c #CADDEB",
+"X= c #37617F",
+"X- c #242A31",
+"X; c #CACACA",
+"X: c #C8DBE9",
+"X> c #90B7D3",
+"X, c #817F7F",
+"X< c #3F7EAB",
+"X1 c #548FB9",
+"X2 c #355873",
+"X3 c #7D7B7B",
+"X4 c #C2C2C2",
+"X5 c #4B8CBA",
+"X6 c #C0C0C0",
+"X7 c #D4E4EE",
+"X8 c #81AECE",
+"X9 c #659CC3",
+"X0 c #787576",
+"Xq c #4788B6",
+"Xw c #252C35",
+"Xe c #757373",
+"Xr c #BABABA",
+"Xt c #FCFDFE",
+"Xy c #B6B6B6",
+"Xu c #C4D9E8",
+"Xi c #706D6E",
+"Xp c #8CB5D2",
+"Xa c #70A3C7",
+"Xs c #8BB5D1",
+"Xd c #5491BC",
+"Xf c #5391BB",
+"Xg c #282424",
+"Xh c #272223",
+"Xj c #6C696A",
+"Xk c #2F4659",
+"Xl c #6B6969",
+"Xz c #407BA5",
+"Xx c #6A6768",
+"Xc c #E4E3E3",
+"Xv c #3E79A3",
+"Xb c #231E1F",
+"Xn c #221E1E",
+"Xm c #E2E1E1",
+"XM c #211C1D",
+"XN c #EBF2F7",
+"XB c #201C1C",
+"XV c #CFE0EC",
+"XC c #4588B7",
+"XZ c #B3CEE1",
+"XA c #366384",
+"XS c #5F98C0",
+"XD c #4386B5",
+"XF c #DEDDDD",
+"XG c #2B3D4B",
+"XH c #615F5F",
+"XJ c #5F5D5D",
+"XK c #5E5B5C",
+"XL c #DCE9F2",
+"XP c #407DA8",
+"XI c #86B1CF",
+"XU c #D4D3D3",
+"XY c #3A698B",
+"XT c #3E7BA6",
+"XR c #232022",
+"XE c #545152",
+"XW c #999899",
+"XQ c #79AACC",
+"X! c #524F50",
+"X~ c #CCCDCB",
+"X^ c #3D749B",
+"X/ c #93BAD5",
+"X( c #77A8CA",
+"X) c #37607E",
+"X_ c #5B96BF",
+"X` c #3F84B4",
+"X' c #CAC9C9",
+"X] c #C6C5C5",
+"X[ c #3F7DAA",
+"X{ c #F2F7FA",
+"X} c #C2C1C1",
+"X| c #212023",
+"o c #9EC1D9",
+"o. c #444142",
+"oX c #3F78A0",
+"oo c #90B8D5",
+"oO c #FEFEFF",
+"o+ c #E2ECF4",
+"o@ c #2B3A47",
+"o# c #25262A",
+"o$ c #B1AFB0",
+"o% c #28313A",
+"o& c #221D1D",
+"o* c #262F38",
+"o= c #629BC2",
+"o- c #302D2E",
+"o; c #6199C1",
+"o: c #201B1B",
+"o> c #4587B6",
+"o, c #F0F0F1",
+"o< c #2D3E4C",
+"o1 c #2E2B2C",
+"o2 c #4385B4",
+"o3 c #A8A7A7",
+"o4 c #A7A5A6",
+"o5 c #3D7197",
+"o6 c #4183B2",
+"o7 c #4083B1",
+"o8 c #A5A3A4",
+"o9 c #3B6F95",
+"o0 c #5290BC",
+"oq c #A4C4DB",
+"ow c #E9F1F7",
+"oe c #4387B7",
+"or c #E7EFF5",
+"ot c #CBDDEA",
+"oy c #4185B5",
+"ou c #5B95BE",
+"oi c #3F83B3",
+"op c #939192",
+"oa c #929191",
+"os c #2B3743",
+"od c #4C4849",
+"of c #2A3742",
+"og c #F4F8FB",
+"oh c #D8E6F0",
+"oj c #4C8CB9",
+"ok c #211F22",
+"ol c #CFD0D0",
+"oz c #444041",
+"ox c #262C34",
+"oc c #413E3E",
+"ov c #403C3D",
+"ob c #3B739B",
+"on c #858384",
+"om c #FFFFFF",
+"oM c #E3EDF4",
+"oN c #5995BF",
+"oB c #3E3A3B",
+"oV c #C7DBE9",
+"oC c #2F4B61",
+"oZ c #5793BD",
+"oA c #3C3839",
+"oS c #2A3945",
+"oD c #7E7D7D",
+"oF c #345873",
+"oG c #363233",
+"oH c #7B797A",
+"oJ c #EFF4F9",
+"oK c #EEF4F8",
+"oL c #F3F3F3",
+"oP c #9ABED7",
+"oI c #4788B7",
+"oU c #629AC1",
+"oY c #ACAAAA",
+"oT c #F1F1F1",
+"oR c #EFEFEF",
+"oE c #737172",
+"oW c #EDEDED",
+"oQ c #A9C9DF",
+"o! c #FBFDFE",
+"o~ c #EBEBEB",
+"o^ c #DFEBF3",
+"o/ c #4581AB",
+"o( c #6F6D6E",
+"o) c #EAE9EA",
+"o_ c #E9E9E9",
+"o` c #C1D7E6",
+"o' c #E7E7E7",
+"o] c #E6E7E6",
+"o[ c #E5E5E5",
+"o{ c #3F7BA5",
+"o} c #242021",
+"o| c #E3E3E3",
+"O c #3E79A4",
+"O. c #221E1F",
+"OX c #26303A",
+"Oo c #9C9A9A",
+"OO c #E1E1E1",
+"O+ c #201C1D",
+"O@ c #4488B7",
+"O# c #DFDFDF",
+"O$ c #7BAACC",
+"O% c #356384",
+"O& c #1E1A1B",
+"O* c #4386B6",
+"O= c #4286B5",
+"O- c #95BAD5",
+"O; c #DDDDDD",
+"O: c #1C1819",
+"O> c #DBDBDB",
+"O, c #D9D9D9",
+"O< c #D7D7D7",
+"O1 c #417FAA",
+"O2 c #DAE7F1",
+"O3 c #F5F9FB",
+"O4 c #D5D5D5",
+"O5 c #242224",
+"O6 c #D4D3D4",
+"O7 c #85B1CF",
+"O8 c #D3D3D3",
+"O9 c #699FC4",
+"O0 c #4D8DB9",
+"Oq c #222022",
+"Ow c #34556F",
+"Oe c #D1D1D1",
+"Or c #D0CFD0",
+"Ot c #8A8888",
+"Oy c #CFCFCF",
+"Ou c #CDCDCD",
+"Oi c #CCCDCC",
+"Op c #CADEEB",
+"Oa c #E5EEF5",
+"Os c #C9DCEA",
+"Od c #ADCADF",
+"Of c #C8DCE9",
+"Og c #91B8D4",
+"Oh c #5994BE",
+"Oj c #3D82B3",
+"Ok c #5894BD",
+"Ol c #3C82B2",
+"Oz c #4181AD",
+"Ox c #3B3737",
+"Oc c #C5C5C5",
+"Ov c #293643",
+"Ob c #3E7DAA",
+"On c #C1C1C1",
+"Om c #353131",
+"OM c #D4E3EE",
+"ON c #B8D1E3",
+"OB c #BFBFBF",
+"OV c #9CBFD8",
+"OC c #80ADCD",
+"OZ c #649BC2",
+"OA c #4889B7",
+"OS c #BDBDBD",
+"OD c #2E292A",
+"OF c #4283B1",
+"OG c #B7B7B7",
+"OH c #4183B0",
+"OJ c #5794BF",
+"OK c #A7C6DC",
+"OL c #365B77",
+"OP c #8BB4D1",
+"OI c #282324",
+"OU c #272323",
+"OY c #6C6A6A",
+"OT c None",
+/* pixels */
+" oToToToT L.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h LoToToToT ",
+"o,.joToToToToToToToToToToToToToToToToToToToT.h.h.h.hoToToToToToToToToToToToToToToToToToToToT.j.j",
+".j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.joToLoLoR.D.~ > >.~.DoRoLoLoT.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j",
+"oRoRoRoRoRoRoRoRoRoRoRoRoRoRoRoT.hXcOBoaXjX!oz c cozX!XjoaOBXc.hoToRoRoRoRoRoRoRoRoRoRoRoRoRoRoR",
+".l.l.l.l.l.l.l.l.l.l.l.l.loR.j <.'X! Y.P.To: $ J J $o:.T.P YX!.' <.joR.l.l.l.l.l.l.l.l.l.l.l.l.l",
+".l.l.l.l.l.l.l.l.l.l.l.l.jXm.&oz + $o& 3.x OoSXGXGoS O.x 3o& $ +oz.&Xm.j.l.l.l.l.l.l.l.l.l.l.l.l",
+"oWoWoWoWoWoWoWoWoWoWoWoR uXK X $XRo% yXA.qo/.fX1X1.fo/.qXA yo%XR $ XXK uoRoWoWoWoWoWoWoWoWoWoWoW",
+".c.c.c.c.c.c.c.c.c.coW Z z $ {os eXTo0..oQX*XLoMoMXLOpoQ..o0XT eos { $ z ZoW.c.c.c.c.c.c.c.c.c.c",
+"o~o~o~o~o~o~o~o~o~.co3.p $.(X2X[OJ FOM !Of 0.d wOg.d 0Os.mOM FOJObX2.( $.po3.co~o~o~o~o~o~o~o~o~",
+".n.n.n.n.n.n.n.noW VoGXMoso9XC G.N.!.^XfXD tOjOlOlOj tXDXd.^.% 1O$O@o9osXMoG VoW.n.n.n.n.n.n.n.n",
+".n.n.n.n.n.n.n.c qo.XBo<XvX5 No oUO0 fOPXpXpXpXpXpXpXpXpOP ( NOdo^OV.sXvo<XBo. q.c.n.n.n.n.n.n.n",
+"o_o_o_o_o_o_.M.L @ $o@o{.s.^.Z & t.* ~omomomomomomomomomomomom.toO.b _ D.Jo@ $ @.Lo)o_o_o_o_o_o_",
+".C.C.C.C.C.Co~o8Xg kX^oeoZXf._XDXD 0omomomomomomomomomomomomomomomom.b #XCX^ kXgo8o~.C.C.C.C.C.C",
+"o'o'o'o'o'.CO>.$okX=oeXDo>O=XD./Xd.momomomomomomomomomomomomomom pX7.NOK 'oeX=ok.$O>.Co'o'o'o'o'",
+" ]o'o'o'.So_ TXh.o nXDXDXDXDXD.; %.bomomomomomomomomomomomomoOo`O9ojo>XDXDXD n.oXh To_ ]o'o'o'.S",
+".D.D.D.D.Do| SX|XY.+XDXDXDXDXDXDXZomomomomomomomomomomomomom.4Xd.;O=XDXDXDXD.+XYX| So|.D.D.D.D.D",
+"o[o[o[o[.D 5OxOvOzO*XDXDXDXD =oZo+omomomomomomomomomomomomomoP.;XDXDXDXDXDXDO*OzOvOx 5o]o[o[o[o[",
+".H.H.H.Ho' POU }oeXDXDXDXDXD.;X8o!omomomomomomomomomomomom.bX(.;XDXDXDXDXDXDXDoe }OU Po'.H.H.H.H",
+"o|o|o|o|.DOt.5XO.+XDXDXDXDXD &ONomomomomomomomomomomomomom.2.7._XDXDXDXDXDXDXD.+XO.5Ot.Do|o|o|o|",
+"o|o|o|o|o|Xi : j.WXDXDXDXD = rOaomomomomomomomomomomomomom AXS._XDXDXDXDXDXDXD.W j :Xio|o|o|o|o|",
+".L.L.L.L.I RXwXP.WXDXDXDXD.;XI momomomomomomomomomomomomomXN.=._XDXDXDXDXDXDXD.WXPXw R.I.L.L.L.L",
+"OOOOOOOOO; [OX.<O*XDXDXDXD IXoomomomomomomomomomomomomomom.UX_._XDXDXDXDXDXDXDO*.<OX [O;OOOOOOOO",
+".I.I.I.IO; )o*O1O*XDXDXD._.).Romomomomomog ~omomomomomomom.UX_._XDXDXDXDXDXDXDO*O1o* )O;.I.I.I.I",
+"O#O#O#O#O# KX-Xz.WXDXDXD.;XsoOomomomomom vowomomomomomomom.UX_._XDXDXDXDXDXDXD.WXzX- KO#O#O#O#O#",
+"O#O#O#O#. g Co5oeXDXDXDXq.Nomomomomom ,X>oromomomomomomom.UX_._XDXDXDXDXDXDXDoeo5 C gOOO#O#O#O#",
+".~.~.~.~OO.- {X).XXDXD._o; HomomomomomohO9.Romomomomomomom.UX_._XDXDXDXDXDXDXD.XX) {.-OO.~.~.~.~",
+"O;O;O;O;O#XyOD .o2XDXD.;Ogomomomomomom / r.Uomomomomomomom.UX_._XDXDXDXDXDXDXDo2 .ODXyO#O;O;O;O;",
+".`.`.`.`O;Oeod.:oX.WXDOAoVomomomomomO3XaOk.Uomomomomomomom.UX_._XDXDXDXDXDXD.WoX.:odOeO;.`.`.`.`",
+"O>O>O>O>O>O;X,.POw.W._ doJomomomomomOMoj r.Uomomomomomomom.UX_._XDXDXDXDXDXD.WOw.PX,O;O>O>O>O>O>",
+"O>O>O>O>O>O;XrOmox.0 9X8Xtomomomomom.6X`ou.Uomomomomomomom.UX_._XDXDXDXDXDoe.0oxOmXrO;O>O>O>O>O>",
+".].].].].].]O,.z JXkOH.VotomomomomX{ 2oiou.Uomomomomomomom.UX_._XDO= &O0 &OFXk J.zO,.].].].].].]",
+"O,O,O,O,O,O,O>OS.yOq.i._OZ ^omomom.E.9._ou.Uomomomomomomom.UX_._._.9.ZXdO=.iOq.yOSO>O,O,O,O,O,O,",
+".{.{.{.{.{.{.{.].,.A BX)oyXXO2omom.Q.;._ou.Uomomomomomomom.UOh._ dO-X9O=X) BOI.,.].{.{.{.{.{.{.{",
+"O<O<O<O<O<O<O<.{O8o(Xno#OLo7.YXuX O7oIoiOk.Romomomomomomom HOCoqOdo=o6OLo#Xno(O8.{O<O<O<O<O<O<O<",
+"O<O<O<O<O<O<O<O<.{X'XJ.PO5.[O iOgXVX:OVXsoKomomomomomomom.bOMX/.1O .[O5.PXJX'.{O<O<O<O<O<O<O<O<",
+".|.|.|.|.|.|.|.|.|.}X]XH.KXn.G eX<oN.e 8 6 Qomomomom.bXN.roo xX< e.GXn.KXHX].}.|.|.|.|.|.|.|.|.|",
+"O4O4O4O4O4O4O4O4O4O4O<X;Xe.vXBX+ofoFob 7.@XQ W | | WXQ.@ 7oboFofX+XB.vXeX;O<O4O4O4O4O4O4O4O4O4O4",
+"X.X.X.X.X.X.X.X.X.X.X.O4X#XW sO. J.K.xo@oC `O%.8.8O% `oCo@.x.K JO. sXWX#O4X.X.X.X.X.X.X.X.X.X.X.",
+"O8O8O8O6O8XUXUO8O8XUXUO8X..|OnX,oc.F $ Jo&XbXRO5O5XRXbo& J $.FocX,On.|X.O8XUX@X@O8.3O8O8O8O8O8X@",
+"O8O8O8O8O8O8O8O8O8O8O8O8O8O8X.X. aop ; c Eo}.PXMXM.Po} E c ;op aX.X.O8O8O8O8O8O8O8O8O8O8O8O8O8O8",
+"X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#O8O4X$X6 P.-onX3X3on.- PX6X$O4O8X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#",
+"OeOeOeOeOeOeOeOeOeOeOeOeOeOeOeOeOeOeOeO8X4OGOnOcOcX} MOSX#OeOeOeOeOeOeOeOeOeOeOeOeOeOeOeOeOeOeOe",
+"X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$O8ono-oAov.w.u.koEX#X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$",
+"X$X$X$X$X$X$X$X$X$olX$X$X$X$X$X$X$X$X$X#oD l.>o1O+.P.T.BOeX$X$X$X$X$X$X$OrOrX$X$X$X$X$X$X$X$X$X$",
+"OyOyOyOyOyOyOyOyOyOyOyOyOyOyOyOyOyOyOyX#oHXEXFoBO&.TO:OYX$OyOyOyOyOyOyOyOyOyOyOyOyOyOyOyOyOyOyOy",
+"X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%Oy POo.CX0 -Xx.g TOyX%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%",
+"X%X%OuOuOuOuOuOuOuOuOuOuOuOuOuOuOuOuOuX% oo$.h boYo4.O UX%OuOuOuOuOuOuOuOuOuOuOuOuOuOuOuOuOuX%X%",
+" Ou.#OuOuOiX&X&X&X&X&X&X&X&X&X&X&X&X&Oy.a 4 * h.K.KO&XlX%X&X&X&X&X&X&X&X&X&X&X&X&X&X&OuOuX~Ou "
+};